1

我有一个模型,Post有很多Comments。的响应GET /posts/12非常适合 Ember 数据:

{
  "post": {
    "id": 12,
    "title": "I Love Ramen",
    "created_at": "2011-08-19T14:22",
    "updated_at": "2011-08-19T14:22",
    "body": "..."
  }
}

Post但是,该s的 APICommentGET /posts/12/comments,它返回

{
  "comments": [
    {
      "id": 673,
      "author_id": 48,
      "created_at": "2011-08-21T18:03",
      "body": "Me too!"
    }
  ]
}

我可以对我的模型或适配器做些什么来告诉它 for Post 12s Comment, use /posts/12/comments?请注意,它Post本身不知道CommentID。

更新

针对buuda 的回答,这里有一些说明:

ThePost必须能够查找它Comment的 s 以便我可以(a)显示对 the 的评论PostRoute和(b)在Postlike上有属性

hasComments: function() {
  return this.get('comments.length') > 0;
}.property('comments')

不过,如果我必须实现comments计算属性,这对我来说很好。在上述答案中,布达建议

App.Comments.find({ id: postId });

如何获取数据存储/posts/:postId/comments而不是fetch /comments?postId=:postId

4

1 回答 1

2

您不一定需要在模型之间设置任何关系。嵌套资源允许您获取适当的数据。使用此路由器:

App.Router.map(function() {
  this.resource('posts', { path: '/posts/:post_id' }, function() {
    this.route('edit');
    this.resource('comments', function() {
      this.route('new');
    });
  });
});

CommentsRou​​te 可以获取它包含的资源的模型,然后获取具有该帖子 ID 的评论:

App.CommentsRoute = Ember.Route.extend({
   model: function() {
       var post = this.modelFor('posts');
       var postId = post.get('id');
       return App.Comments.find({ id: postId });
   }
});

帖子模型不需要知道评论 ID,但底层数据存储必须根据帖子 ID 查询返回适当的评论。然后将返回的数组用作评论路由的模型。

编辑:

我假设您使用的是 ember-data。如果是这样,则尚不支持嵌套资源 URL (posts/:postId/comments)。要在帖子路由中显示评论,您可能需要获取评论数据,将其设置在评论控制器上,在帖子控制器中使用控制器注入(“需要”),并使用实验性“控制”把手标签来显示评论视图:

App.PostsRoute = Ember.Route.extend({
   setupControllers: function() {
       var post = this.modelFor('posts');
       var postId = post.get('id');
       var comments = App.Comments.find({ id: postId });
       this.controllerFor('comments').set('content', comments);
   }
});

我在这里解释如何使用实验控制标签:How to Render HasMany Associations With their Own Controller

于 2013-03-13T03:47:56.203 回答