考虑与概述的示例类似的内容 here :
App.Router.map(function() {
this.resource("posts", function() {
this.resource("post", { path: "/posts/:post_id" }, function() {
this.resource("comments", { path: "/comments" });
});
});
});
使用 DS.RESTAdapter
。当我通过调用 API URL /posts
访问 PostsRoute
时,Router
将加载所有帖子。
然后当我访问 PostRoute
时,例如对于带有 id=1
的帖子,它不会再次访问 API,即它不会访问 /post/1
。它从商店加载帖子。
然后我想访问 CommentsRoute
以使用 id=1
发表文章。如何加载评论?
当我加载帖子列表时,我是否应该首先侧载所有评论?不过在这种情况下,我需要加载所有帖子的所有评论。是否可以仅在需要时加载评论,即当我访问 CommentsRoute
时?
在这种情况下,我实际上如何从后端加载评论?
具体来说,当我访问实际显示评论的页面时,如何编写 CommentsRoute
以从 RESTful API 加载评论?
我想一个人需要具备以下条件:
App.Post = DS.Model.extend({
comments: DS.hasMany('comment')
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('post')
});
App.CommentsRoute = Ember.Route.extend({
model: function() {
/*
* How do I inject params.post_id here
* to make a request to the RESTful API?
* Which URL would be called?
* /comments?post_id=ID
* /post/post_id/comments
* ...
*/
// Doesn't work, hits /comments
return this.store.find('comment', { post_id: params.post_id });
}
});
为什么
return this.store.find('comment', { post_id: params.post_id });
点击 /comments
?
最佳答案
您只需要像这样声明您的CommentsRoute
:
App.CommentsRoute = Ember.Route.extend({
model: function() {
return this.modelFor('post').get('comments');
}
});
它所做的是获取 PostRoute
的模型并获取其评论。
Ember-data 处理其背后的逻辑。如果注释被旁加载,它只会返回这些。否则它将发出 GET 请求来获取它们。
为此,您需要在序列化帖子中包含 links
属性。 links
属性需要包含您希望 ember-data 用于获取评论的 URL。
例如您的连载文章可能如下所示:
{
"post": {
"id": 1,
"title": "Rails is omakase",
"links": { "comments": "/posts/1/comments" }
}
}
参见 DS.RESTAdapter#findHasMany .
hasMany
关系可能需要声明为异步才能正常工作:
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', { async: true })
});
关于javascript - 使用 Ember.js 加载属于父模型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958323/