首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将关系注入Ember Payload

将关系注入Ember Payload
EN

Stack Overflow用户
提问于 2018-08-29 05:35:32
回答 1查看 81关注 0票数 2

我有一个为帖子显示和创建评论的组件,这个组件有一个用于创建新评论的表单,并通过帖子将它们发送到后端,正常的有效负载为:

代码语言:javascript
复制
{
  data: {
    attributes: {
      created_at: "foo",
      autor: "foo",
      text: "foo"
    },
    relationships: {
      post: {
        data: { type: "posts", id: 1234 },
        id: "1234",
        type: "loans"
      }
    },
    type: "comment"
  }
}

当您需要在另一个视图中使用组件时,问题就来了,更重要的是,当模型的名称不同时,比如说posts_breakdown,在这种情况下,有效负载将是:

代码语言:javascript
复制
    { data: {
        attributes: {
          created_at: "foo",
          autor: "foo",
          text: "foo"
        },
        relationships: {
          post: {
            data: null
          }
        },
        type: "comment"
      }
    }

显然,在注释中,没有关系posts_breakdown,这是我尝试使用posts_breakdown: belongsTo (posts_breakdown)将此关系添加到模型中的第一件事。

问题是,后台无法识别它,也无法对其进行修改。后端获取关系上的值,将评论与帖子关联起来(评论表中的post_id字段)

My question:有没有办法“欺骗”后端和/或修改负载,所以认为post_breakdown模型已经发布了?

下面是我如何定义模型的表示:

comment.js:

代码语言:javascript
复制
    export default DS.Model.extend ({
        author: DS.attr (),
        text: DS.attr (),
        created_at: DS.attr (),
        post: DS.belongsTo ('post'),
        posts_breakdown: DS.belongsTo ('posts_breakdown'),
    });

posts.js:

代码语言:javascript
复制
    export default DS.Model.extend ({
        text: DS.attr (),
        created_at: DS.attr (),
        author: DS.attr (),
        comments: DS.hasMany ('comments'),
    });

post_breakdown.js

代码语言:javascript
复制
    export default DS.Model.extend ({
        most_commented_post: DS.attr (),
        last_commented_post: DS.attr (),
        frequent_users: DS.attr (),
        comments: DS.hasMany ('comments'),
    });
EN

回答 1

Stack Overflow用户

发布于 2018-08-30 00:07:24

好了,我已经想出了修改负载的方法,把它发送到后端。Ember有序列化程序!

遵循本指南,我可以将数据修改为有效负载,擦除它,添加它或任何我需要的:

https://guides.emberjs.com/release/models/customizing-serializers/

在我的例子中,首先我需要将关系添加到评论的模型中,如下所示:

代码语言:javascript
复制
`posts_breakdown: DS.belongsTo ('posts_breakdown')`

然后使用ember-cli为comment的模型生成序列化程序:

代码语言:javascript
复制
`ember generate serializer comment`

最后,进入序列化程序,如果有效负载包含进入post_breakdown关系的数据,删除它并将其传递给post关系,这样,有效负载是相同的:

代码语言:javascript
复制
import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  /*
  This two functions, are necesary because Ember Data changes the underscore
  between variable names by dashes. In fact, it's a Ember suggestion.
  */
  keyForAttribute: function (key) {
    return key;
  },

  keyForRelationship: function (key) {
    return key;
  },

  serialize(snapshot, options) {
    let json = this._super(...arguments);
    /* This makes possible to store comments when the comments-panel-loan component is used
    in loan_breakdown view with post_breakdown model:
    */
    if (json.data.relationships.post_breakdown.data) {
      json.data.relationships.loan = {
        data: {
          type: "posts",
          id: json.data.relationships.post_breakdown.data.id }
      };
      delete json.data.relationships.post_breakdown;
    }
    return json;
  },
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52066506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档