【发布时间】: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.project、model.tasks、model.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