Backbone.js model.has方法不适用于子对象

时间:2014-07-18 19:20:00

标签: backbone.js

我正在使用backbone.js开发应用程序,而且我有时会使用包含子对象的基于JSON的模型,如下所示:

{
"key1": "value1",
"key2": "value2",
"key3": {
         "key1": "value1"
        },

}

现在似乎该模型的方法"已经" (返回布尔值或不是键是模型的一部分)不适用于子对象。

例如,对于上面的数据,这将返回undefined

myModel.has("key3.key1")

知道怎么处理这个案子吗?

由于

1 个答案:

答案 0 :(得分:0)

我建议,不要覆盖默认行为,而是可以使用与

类似的东西轻松构建此功能
var buildDeepMap = function(baseKey, map, obj){
    _.each(obj, function(value, objKey){
        var key = baseKey === ''? objKey : baseKey+'.'+objKey;
        if(typeof value === 'object'){
            buildDeepMap(key, map, value)
        }else{
            map[key]=value;
        }
    })
    return map;
}

var MyModel = Backbone.Model.extend({
    constructor: function(){
        Backbone.Model.apply(this, arguments);
        this.buildDeepMap();
    },
    buildDeepMap: function(){
        this.deepFlatIndex = buildDeepMap('', {}, this.toJSON());
    },
    deepHas: function(key){
        return _.has(this.deepFlatIndex, key)
    }
});

用法可以是这样的

 var data = {
     "key1": "value1",
     "key2": "value2",
     "key3": {
         "key1": "value1"
     }
 }
 var myDeepHasModel = new MyModel(data);

 console.log(myDeepHasModel.deepHas('key1')); //true
 console.log(myDeepHasModel.deepHas('key3.key1')); //true
 console.log(myDeepHasModel.deepHas('key3.key2')); //false