在Ember数据中加载关系模型

时间:2017-09-16 14:35:33

标签: javascript ember.js ember-data

我对Ember Data有一些疑问。 我有一个帖子和评论模型。

//post.js
comments: DS.hasMany('comment')

//blog.js
post: DS.belongsTo('post')

我可以使用

为特定的“帖子”创建评论
let blogPost = this.get('store').findRecord('post', 1);
let comment = this.get('store').createRecord('comment', {
   post: blogPost
});

但是我如何获取特定帖子的所有评论? 就像,我有多个帖子有很多评论,我想要特定帖子ID的所有评论,比如帖子/ id /评论

从商店和服务器获取特定帖子ID的评论的正确方法是什么?

我得到的服务器响应只是“findRecord”帖子时评论的ID。 我遵循REST API格式并使用REST适配器和REST序列化程序进行自定义。

提前致谢。

1 个答案:

答案 0 :(得分:1)

有很多方法可以将这些记录加载到商店中。您如何选择这样做取决于后端的设置方式。最简单的选项是在模板中使用子记录或进行查询。以下说明仅适用于使用REST适配器的应用程序(因为JSONAPI请求已标准化)。

让我们从使用模板中的记录开始。

在路线中,获取帖子并在模型钩子中返回:

// post.js route    
import Ember from 'ember';

export default Ember.Route.extend({
  model(params) {
    return this.store.findRecord('post', params.post_id)
  },
});

将模型及其子记录传递给组件:

// post.hbs route template
{{some-component comments=model.comments}}

然后使用该组件中的注释:

{{#each comments as |comment|}}
   <p>{{comment.note}}<p>
{{/each}}

您应该会发现,使用模板中的评论会触发GET请求,这些请求会返回到您的初始帖子提取时返回的ID,例如/comments/1/comments/2等。在组件中&#39;您可以通过this.get('comments')

访问评论

另一个选项是指定要由后端接收和处理的查询参数。

// post.js route    
import Ember from 'ember';

export default Ember.Route.extend({
  model(params) {
    return this.store.query('comments', {post: params.post_id})
  },
});

上面的代码会向/ comments?post = 1发出GET请求。后端负责过滤数据库并仅返回属于帖子的记录。由于模型是评论的集合,因此您可以在以下模板中使用上述结果:

{{#each model as |comment|}}
  <p>{{comment.note}}</p>
{{/each}}