17

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

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

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

我考虑过的一些方法:

  • 修改序列化程序以检查此特定属性并将其从有效负载中删除,然后再将其发送到后端
  • 将“嵌入片段”字段转换为与表单模型有关系的单独模型,然后以某种方式将其从保存中排除
  • 创建新的 Ember Data 属性类型

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

就像是:

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

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

4

3 回答 3

23

要获得{ readOnly: true }功能(这使得添加新模型/属性更容易),您可以自定义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);
  },
});
于 2016-06-25T01:28:49.480 回答
18

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

于 2015-09-28T19:07:33.070 回答
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

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


更新

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

def self.updatable_fields(context)
  super - [:whatever]
end
于 2015-12-28T20:42:48.170 回答