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

时间:2015-09-28 18:59:44

标签: ember.js ember-data jsonapi-resources

我正在使用前端的Ember 2.0和后端的Rails 4.2创建一个在线表单构建器,其中包含json_api_resources gem。

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

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

我考虑过一些方法:

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

理想情况下,有更好的方法可以解决这个问题。

类似的东西:

'DS.attr('string', { readOnly: true })

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

3 个答案:

答案 0 :(得分:22)

要获得{ readOnly: true }功能(这样可以更轻松地添加新模型/ attrs),您可以自定义serializeAttribute上的JSONAPISerializer方法:

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

答案 1 :(得分:17)

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

app/serializers/form.js

export default DS.JSONAPISerializer.extend({
    attrs: {
        embedSnippet: { serialize: false }
    }
});

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

答案 2 :(得分:3)

您也可以使用json-api-resources从后端控制此项。无论适当的资源文件是什么,您都可以控制允许从后端检索哪些属性以及后端允许哪些属性接受。像这样:

def self.fetchable_fields(context)
  super - [
    :whatever_attribute_not_to_fetch_from_backend
  ]
end

def self.creatable_fields(context)
  super - [
    :embed_snippet,
    :another_attribute_not_accepted_from_post
  ]
end

这可能不是您正在寻找的内容,因为它不会阻止属性发送到后端,而是阻止它们接受< / em>的。但这是另一种选择。

更新

根据您的使用情况,您可能还需要使用此功能:

def self.updatable_fields(context)
  super - [:whatever]
end