gpt4 book ai didi

javascript - Ember & 回复 : How to resolve nested relations in route's model function?

转载 作者:行者123 更新时间:2023-11-30 17:11:49 27 4
gpt4 key购买 nike

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

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

我当前的方法不适用于嵌套关系(我在评论中对其进行了描述)。

首先是一些模型定义:

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 中的错误。我试图确定实际问题,但列出了多个可能导致问题的因素。

再来一次。谢谢!

最佳答案

这里的大部分问题都是围绕着这样一个事实解决的,即您的 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

关于javascript - Ember & 回复 : How to resolve nested relations in route's model function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com