如何防止Ember数据保存属性(即,只读属性)

Chr*_*lne 15 ember.js ember-data jsonapi-resources

我正在创建一个在线表单构建器,在前端使用Ember 2.0,在后端使用json_api_resources gem创建Rails 4.2.

在发布表单的过程中,用户必须能够将一段代码剪切/粘贴到他/她的网页中,以便'ajax in'他们已经配置的表单.

因此,Form模型的'embed-snippet'属性应该是只读的.当用户对表单进行更改并重新保存记录时,我不希望将代码段字段的内容发送回服务器.

我考虑过的一些方法:

  • 修改序列化程序以检查此特定属性,并在将其发送到后端之前将其从有效内容中删除
  • 将'embed-snippet'字段转换为与Form模型有关系的单独模型,然后以某种方式将其从保存中排除
  • 创建新的Ember Data属性类型

理想情况下,有一种更好的方法来处理这个问题.

就像是:

'DS.attr('string', { readOnly: true })
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,确保此字段的内容不会被发送回服务器的最佳方法是什么?

bok*_*nic 22

要获得{ readOnly: true }功能(这使得更容易添加新模型/ attrs),您可以在以下方面自定义serializeAttribute方法JSONAPISerializer:

(in serializers/application.js):

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  serializeAttribute(snapshot, json, key, attribute) {
    // do not serialize the attribute!
    if (attribute.options && attribute.options.readOnly) {
      return;
    }
    this._super(...arguments);
  },
});
Run Code Online (Sandbox Code Playgroud)


bma*_*mac 17

最简单的方法是为表单模型创建自定义序列化程序,并使用该attrs属性来防止该属性被序列化.

app/serializers/form.js:

export default DS.JSONAPISerializer.extend({
    attrs: {
        embedSnippet: { serialize: false }
    }
});
Run Code Online (Sandbox Code Playgroud)

有关attrs的更多信息和示例,请参阅API文档http://emberjs.com/api/data/classes/DS.JSONSerializer.html#property_attrs