ember.js - 将关系注入(inject) Ember 有效负载

标签 ember.js ember-data ember-cli

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

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

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

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

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

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

我的问题:是否有某种方法可以“欺骗”后端和/或修改有效负载,以便认为 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'),
    });

最佳答案

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

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

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

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

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

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

`ember generate serializer comment`

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

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

关于ember.js - 将关系注入(inject) Ember 有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52066506/

相关文章:

ember.js - 如何在应用程序启动时加载Ember Data数据?

javascript - Ember 第一个应用程序无法识别 xml2json 中的 xmlcode

ember.js - 如何调试在phantomjs中运行的ember-cli测试

javascript - Ember.js 如何扁平化异步 hasMany 关系

ember.js - 删除记录时,转换到另一条路线失败

javascript - 为什么 ember 没有为 REST 请求使用正确的主机?

Ember.js——如何从路由访问 Ember session 中的数据

ember.js - 如何让两个 ember-cli 服务交叉通信?

ember.js - Ember Data 1.0.0 : this. modelFor ('author' ).save 失败 - 如何在 Controller 中保存新创建的记录?

javascript - 是否可以将条件或其他 javascript 作为参数传递给 ember handlebars?