【问题标题】:Ember & RSVP: How to resolve nested relations in route's model function?Ember & RSVP:如何解决路由模型函数中的嵌套关​​系?
【发布时间】:2014-11-09 16:22:26
【问题描述】:

在理解如何解决 ember 中的嵌套模型时遇到问题。该死的。

我不知道这是否是一种常见的方法,但我根本不希望我的控制器或组件关心异步性。因此,有必要解决我的路线所需的一切。

我目前的方法不适用于嵌套关系(我在 cmets 中进行了描述)。

首先是一些模型定义:

var Project = DS.Model.extend({
    name: DS.attr("string"),
    tasks: DS.hasMany("task", {async: true}),
    // ...
});

var Task = DS.Model.extend({
    name: DS.attr("string"),
    documentation: DS.belongsTo("task_documentation", {async: true}),
    // ...
});

var TaskDocumentation = DS.Model.extend({
    lastEditor: DS.attr("string")
    // ...
});

项目路线:

ProjectRoute = Em.Route.extend({
    model: function () {
        var project;
        return this.store.find("project", {name: "foo"}).then(function (resolvedProject) {
            project = resolvedProject.objectAt(0);
            return resolvedProject.get("tasks");
        }).then(function (resolvedTasks) {
            console.log("For some reason nothing left to do to resolve tasks: " 
                    + project.get("tasks").objectAt(0).get("name"));

            // Collect documentation
            var docu = []
            project.get("tasks").forEach(function (task, index) {
                docus[i] = task.get("documentation");
            });
            return Em.RSVP.all(docus);
        }).then(function (resolvedDocus) {
            // docus are resolved but not attached to project.
            console.log(project.get("tasks")
                   .objectAt(0)
                   .get("documentation")
                   .get("lastEditor")); // "undefined"

            // Setting documentation for each task manually does not help:
            project.get("tasks").forEach(function(task, index) {
                task.set("documentation", resolvedDocus.objectAt(index));
            });
            console.log(project.get("tasks")
                   .objectAt(0)
                   .get("documentation")
                   .get("lastEditor")); // still undefined

            return project;
        });
    }
});

我目前正在使用 Ember 1.7.0 和 Ember Data 1.0.0-beta.10

我想有一个更简单的方法。希望大家能给我一点提示。提前致谢!

更新:

感谢您输入KingPin!

我完全忘记提及的一个重要细节是我现在正在使用 FixturesAdaptor。这就是为什么所有东西都必须声明为异步的原因。

你说 find 返回的集合没有定义任务。事实并非如此。一切都正确解决。任务可用。甚至可以访问每个任务的文档。

// ...
}).then(function (resolvedDocus) {
    // resolvedDocus have been resolved. I simply cant't attach them to project's tasks
    console.log(resolvedDocus.firstObject.lastEditor); // "Mr. Foo"

});

我想要完成的是返回一个可以直接访问其属性的项目。目前我可以创建类似model.projectmodel.tasksmodel.taskDocs 的东西,但是当我设置 project.someTask 的文档时,什么都没有发生。

另一个更新(因为我很愚蠢)

有错别字。

var project;
return this.store.find("project", {name: "foo"}).then(function (resolvedProject) {
    project = resolvedProject.objectAt(0);
    // This of course returns a collection.
    return resolvedProject.get("tasks");
    // I meant...
    return resolvedProject.objectAt(0).get("tasks");

问题还是一样。很抱歉,如果这造成了混乱。

已解决

原来是 Ember-Data 1.0 beta 10 中的一个错误。我试图找出实际问题,但列出了多个可能导致问题的因素。

再一次。谢谢!

【问题讨论】:

  • 您可以控制 API 吗?让这些关系异步,然后强制它们立即获取所有内容,这似乎是在浪费对服务器的调用。这似乎是使用嵌入式记录并跳过异步的好机会。
  • 对不起,我忘了告诉。更新了问题。
  • 您是否介意用您的全部承诺以及未显示您期望的区域更新问题?
  • 你认为你可以用我的 jsbin 重现你看到的问题吗?

标签: javascript ember.js ember-data rsvp.js


【解决方案1】:

您在这里的大多数问题都解决了这样一个事实,即您的find 返回一个集合,该集合上没有定义tasks(我特指resolvedProject.get('tasks')),因此您永远无法解决任务。

ProjectRoute = Em.Route.extend({
    model: function () {
        var project;
        return this.store.find("project", {name: "foo"}).then(function (resolvedProjects) {
            // resolvedProjects is a collection, 
            // but let's assume your api only returns a single project
            project = resolvedProject.objectAt(0);
            return project.get("tasks");
        }).then(function (resolvedTasks) {
            // this was empty because you didn't grab the tasks off a project
            console.log(project.get("tasks.firstObject.name"));

            var documents = resolvedTasks.getEach('documentation');
            return Em.RSVP.all(documents);
        });
    }
});

示例:http://emberjs.jsbin.com/sonane/1/edit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多