使用Ember.js加载属于父模型的数据

时间:2014-05-30 15:38:06

标签: javascript ember.js ember-data

考虑类似于概述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}}?

3 个答案:

答案 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') });
  }
});