我使用Ember-Data(v1.13.13)来管理来自服务器的对象。
传入属性的值为null。属性类型是一个字符串,其默认值为空字符串。 null不会像预期的那样默认为空字符串。所以看起来默认情况下Ember-Data建立了一个可以为空的字符串数据类型(当然是考虑它,当然不是JavaScript的东西)。
在任何情况下,我都想知道如何将传入的null转换为默认的空字符串值,因为模型是“实例化的”。那或指示Ember-Data根据字符串类型而不是可空字符串类型来考虑属性。
模型(简化):
App.Note = DS.Model.extend({
mystring: DS.attr('string', { defaultValue: '' })
});
传入的对象:
{
"notes": [{
"mystring": null
}]
}
内存中的结果值:
<App.Note:ember1133:1775>
mystring: null
答案 0 :(得分:2)
空字符串和空字符串不同,因此Ember Data的string
转换不会进行转换也就不足为奇了。但是,您可以自己编写:
// transforms/string-null-to-empty.js
export default DS.Transform.extend({
deserialize(serialized) { return serialized || ''; },
serialize(deserialized) { return deserialized; }
});
然后
mystring: DS.attr('string-null-to-empty')
答案 1 :(得分:1)
覆盖RESTSerializer中的normalize
方法也可以解决问题。这样的事情应该有效
DS.RESTSerializer.extend({
normalize: function(modelClass, hash, prop) {
// Do whatever checking you need to to make sure
// modelClass (or hash.type) is the type you're looking for
hash.mystring = hash.mystring || '';
return this._super(modelClass, hash, prop);
}
});
当然,如果你不总是知道你需要将哪些键从null标准化为空字符串,那么你可以迭代所有键(但这会慢一点)。
DS.RESTSerializer.extend({
normalize: function(modelClass, hash, prop) {
Object.keys(hash).forEach(function(key){
hash[key] = hash[key] || '';
});
return this._super(modelClass, hash, prop);
}
});