如何获取并设置嵌套对象属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

我有一个关于Backbone.js的getset函数的简单问题。

1)使用下面的代码,我如何直接获取或设置obj1.myAttribute1?

另一个问题:

2)在模型中,除了默认对象之外,我可以在哪里声明模型的其他属性,以便可以通过Backbone的get和set方法访问它们?

var MyModel = Backbone.Model.extend({
    defaults: {
        obj1 : {
            "myAttribute1" : false,
            "myAttribute2" : true,
        }
    }
})

var MyView = Backbone.View.extend({
    myFunc: function(){
        console.log(this.model.get("obj1"));
        //returns the obj1 object
        //but how do I get obj1.myAttribute1 directly so that it returns false?
    }
});

我知道我可以这样做:

this.model.get("obj1").myAttribute1;

但这是一种好的做法吗?

提问于
用户回答回答于

虽然this.model.get("obj1").myAttribute1没问题,但它有点问题,因为那时你可能会试图为set设置相同的类型,即

this.model.get("obj1").myAttribute1 = true;

但是,如果你这样做,你将不会myAttribute1像改变事件或验证一样获得Backbone模型的好处。

更好的解决方案是永远不要在你的模型中嵌套POJSO(“普通的旧JavaScript对象”),而是嵌套自定义模型类。所以它看起来像这样:

var Obj = Backbone.Model.extend({
    defaults: {
        myAttribute1: false,
        myAttribute2: true
    }
});

var MyModel = Backbone.Model.extend({
    initialize: function () {
        this.set("obj1", new Obj());
    }
});

然后访问代码将是

var x = this.model.get("obj1").get("myAttribute1");

但更重要的是设置代码将是

this.model.get("obj1").set({ myAttribute1: true });

这将引发适当的变化事件等。工作示例:http : //jsfiddle.net/g3U7j/

用户回答回答于

我为此创建了backbone-deep-model - 只需扩展Backbone.DeepModel而不是Backbone.Model,然后就可以使用路径获取/设置嵌套的模型属性。它也保持更改事件。

model.bind('change:user.name.first', function(){...});
model.set({'user.name.first': 'Eric'});
model.get('user.name.first'); //Eric

扫码关注云+社区