我对 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 的所有评论,例如 posts/id/comments
从商店和服务器获取特定帖子 ID 的评论的正确方法是什么?
我得到的服务器响应只是“findRecord”帖子时评论的 ID。 我遵循 REST API 格式并使用 REST 适配器和 REST 序列化器进行自定义。
提前致谢。
最佳答案
有很多方法可以将这些记录加载到存储中。您选择如何执行此操作取决于后端的设置方式。最简单的选项是使用模板中的子记录或执行查询。以下说明仅适用于使用 REST 适配器的应用(因为 JSONAPI 请求已标准化)。
让我们从使用模板中的记录开始。
在路由中,获取帖子并将其返回到模型 Hook 中:
// 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}}
您应该发现,在模板中使用评论会触发对随初始帖子提取返回的 ID 的 GET 请求,例如 /comments/1
、/comments/2
等。在组件的操作中,您可以通过 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}}
关于javascript - 在 Ember 数据中加载关系模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46255025/