【问题标题】:Loading relationship model in Ember data在 Ember 数据中加载关系模型
【发布时间】:2017-09-16 14:35:33
【问题描述】:

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

//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
});

但是我如何获取特定帖子的所有 cmets? 就像,我有多个帖子,其中有很多 cmets,我想要一个特定帖子 ID 的所有 cmets,比如 posts/id/cmets

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

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

提前致谢。

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案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}}
    

    然后使用该组件中的 cmets:

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

    您应该会发现,在模板中使用 cmets 会触发对初始 post fetch 返回的 id 的 GET 请求,例如 /comments/1/comments/2 等。在组件的操作中,您可以访问 cmets如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})
      },
    });
    

    上面的代码将向 /cmets?post=1 发出 GET 请求。后端负责过滤数据库,只返回属于帖子的记录。由于模型是 cmets 的集合,您可以在这样的模板中使用上述结果:

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

    【讨论】:

    • 只想告诉你,你的答案很好,有详细的解释。请继续努力。
    • 谢谢,我想请求像上面提到的 post/postID/cmets 这样的 cmets。是否可以在不使用适配器中的任何自定义的情况下自然地请求这样的请求?
    • 不,您需要制作一个适配器并覆盖 urlFor 以执行嵌套 url。另一种选择是使用像 github.com/amiel/ember-data-url-templates 这样的插件
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多