【问题标题】:Inject Relationships into Ember Payload将关系注入 Ember 有效负载
【发布时间】:2019-03-25 03:43:50
【问题描述】:

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

{
  data: {
    attributes: {
      created_at: "foo",
      autor: "foo",
      text: "foo"
    },
    relationships: {
      post: {
        data: { type: "posts", id: 1234 },
        id: "1234",
        type: "loans"
      }
    },
    type: "comment"
  }
}

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

    { data: {
        attributes: {
          created_at: "foo",
          autor: "foo",
          text: "foo"
        },
        relationships: {
          post: {
            data: null
          }
        },
        type: "comment"
      }
    }

显然,在 cmets 中,没有关系 posts_breakdown,我首先尝试使用 posts_breakdown: belongsTo (posts_breakdown) 将此关系添加到模型中。

问题是,后端无法识别它并且无法修改它。 后端正在获取关系上的值以将评论与帖子相关联(post_id 字段到评论表中)

My question: 有没有办法“欺骗”后端和/或修改payload,所以认为post_breakdown模型是贴出来的?

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

comment.js:

    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:

    export default DS.Model.extend ({
        text: DS.attr (),
        created_at: DS.attr (),
        author: DS.attr (),
        comments: DS.hasMany ('comments'),
    });

post_breakdown.js

    export default DS.Model.extend ({
        most_commented_post: DS.attr (),
        last_commented_post: DS.attr (),
        frequent_users: DS.attr (),
        comments: DS.hasMany ('comments'),
    });

【问题讨论】:

  • 写一个序列化器来转换你发送到服务器的payload
  • 嗨,非常感谢,这是我需要的 :)

标签: ember.js ember-data ember-cli


【解决方案1】:

好的,我已经想出了修改有效负载的方法,将其发送到后端。 Ember 有序列化器!

按照本指南,我可以将数据修改到有效负载中,删除它,添加它或任何我需要的:

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

我的情况,首先我需要将关系添加到评论的模型中,在这一行:

`posts_breakdown: DS.belongsTo ('posts_breakdown')`

然后使用 ember-cli 为评论的模型生成一个序列化器:

`ember generate serializer comment`

最后,如果payload包含数据进入到post_breakdown关系中,则进入序列化器,将其删除并传递给post关系,这样,payload是一样的:

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

【讨论】:

  • 感谢您撰写解决方案!现实生活中的序列化程序示例非常有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多