Ember-data:如何将传入的空值设置为空字符串值?

时间:2015-10-08 12:13:50

标签: ember.js ember-data

我使用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

2 个答案:

答案 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);
   }
 });