考虑类似于概述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网址Router
访问PostsRoute
时,/posts
会加载所有帖子。
当我然后访问PostRoute
时,例如id=1
的帖子,它再次没有点击API,即它没有点击/post/1
。它从商店加载帖子。
然后,我希望CommentsRoute
访问id=1
以发布CommentsRoute
。如何加载评论?
当我加载帖子列表时,我是否应该首先加载所有评论?但在这种情况下,我需要加载所有帖子的所有评论。是否可以仅在需要时加载评论,即当我访问CommentsRoute
?
在这种情况下,我如何从后端实际加载评论?
具体来说,当我访问实际显示它们的页面时,如何编写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 });
}
});
来加载RESTful API中的注释?
我想我需要有以下内容:
return this.store.find('comment', { post_id: params.post_id });
为什么
/comments
点击{{1}}?
答案 0 :(得分:2)
您可以使用Ember的侧载关系来使帖子API端点也返回相关注释,而Ember会将其弄清楚。
http://emberjs.com/guides/models/the-rest-adapter/#toc_sideloaded-relationships
{
"post": {
"id": 1,
"title": "Node is not omakase",
"comments": [1, 2, 3]
},
"comments": [{
"id": 1,
"body": "But is it _lightweight_ omakase?"
},
{
"id": 2,
"body": "I for one welcome our new omakase overlords"
},
{
"id": 3,
"body": "Put me on the fast track to a delicious dinner"
}]
}
然后,您就可以将已加载的评论传递到评论路线。
它可能在文档中,但它是一个非常具体的术语!像搜索这样的一些概念可能有点难以搜索。
答案 1 :(得分:2)
您只需要声明CommentsRoute
这样:
App.CommentsRoute = Ember.Route.extend({
model: function() {
return this.modelFor('post').get('comments');
}
});
它的作用是,它获取PostRoute
的模型并获取其注释。
Ember-data处理它背后的逻辑。如果评论是侧载的,它将只返回这些。否则它将发出GET请求来获取它们。
为此,您需要在序列化帖子中包含links
属性。 links
属性需要包含您希望使用ember-data来获取注释的URL。
E.g。您的序列化帖子可能如下所示:
{
"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 })
});
答案 2 :(得分:0)
以下强制调用后端/comments?post_id=ID
App.CommentsController = Ember.ArrayController.extend({
needs: 'post'
});
App.CommentsRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('comment', { post_id: this.modelFor('post').get('id') });
}
});