如何防止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' 属性应该是只读的。我不希望在用户更改表单并重新保存记录时将代码段字段的内容发送回服务器。
我考虑过的一些方法:
- 修改序列化程序以检查此特定属性并在将其发送到后端之前将其从负载中删除
- 将 'embed-snippet' 字段转换为与表单模型有关系的单独模型,然后以某种方式将其从保存中排除
- 正在创建新的 Ember 数据属性类型
理想情况下会有更好的方法来处理这个问题。
类似于:
'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);
},
});
我正在创建一个在线表单生成器,前端使用 Ember 2.0,后端使用 Rails 4.2,json_api_resources gem。
在发布表单的过程中,用户必须能够 cut/paste 一段代码进入 his/her 网页,以便 'ajax in' 他们配置的表单。
因此 Form 模型的 'embed-snippet' 属性应该是只读的。我不希望在用户更改表单并重新保存记录时将代码段字段的内容发送回服务器。
我考虑过的一些方法:
- 修改序列化程序以检查此特定属性并在将其发送到后端之前将其从负载中删除
- 将 'embed-snippet' 字段转换为与表单模型有关系的单独模型,然后以某种方式将其从保存中排除
- 正在创建新的 Ember 数据属性类型
理想情况下会有更好的方法来处理这个问题。
类似于:
'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);
},
});