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

How to prevent Ember Data from saving attribute (ie., Read-only attribute)

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

在发布表单的过程中,用户必须能够 cut/paste 一段代码进入 his/her 网页,以便 'ajax in' 他们配置的表单。

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

我考虑过的一些方法:

理想情况下会有更好的方法来处理这个问题。

类似于:

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

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

最简单的方法是为表单模型创建自定义序列化程序并使用 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

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

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

这可能不是您要查找的内容,因为它不会阻止属性被 发送 到后端,而是阻止它们被 接受。但这是另一种选择。


更新

根据您的用例,您可能还需要使用这个:

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

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

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