首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Backbone.js获取和设置嵌套对象属性

Backbone.js获取和设置嵌套对象属性
EN

Stack Overflow用户
提问于 2011-06-15 07:13:33
回答 9查看 83.7K关注 0票数 107

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

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

另一个问题:

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

代码语言:javascript
复制
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?
    }
});

我知道我能做到:

代码语言:javascript
复制
this.model.get("obj1").myAttribute1;

但这是一种好的做法吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-06-15 07:44:12

虽然this.model.get("obj1").myAttribute1很好,但它有点问题,因为这样您可能会尝试为set做相同类型的事情,例如

代码语言:javascript
复制
this.model.get("obj1").myAttribute1 = true;

但是,如果您这样做,您将无法获得myAttribute1主干模型的好处,如更改事件或验证。

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

代码语言:javascript
复制
var Obj = Backbone.Model.extend({
    defaults: {
        myAttribute1: false,
        myAttribute2: true
    }
});

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

则访问代码将为

代码语言:javascript
复制
var x = this.model.get("obj1").get("myAttribute1");

但更重要的是,设置代码应该是

代码语言:javascript
复制
this.model.get("obj1").set({ myAttribute1: true });

其将触发适当的改变事件等。此处的工作示例:http://jsfiddle.net/g3U7j/

票数 145
EN

Stack Overflow用户

发布于 2011-11-05 21:57:44

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

代码语言:javascript
复制
model.bind('change:user.name.first', function(){...});
model.set({'user.name.first': 'Eric'});
model.get('user.name.first'); //Eric
票数 75
EN

Stack Overflow用户

发布于 2012-02-20 07:16:05

多梅尼克的解决方案将会起作用,但是每个新的MyModel都将指向相同的Obj实例。为了避免这种情况,MyModel应该看起来像这样:

代码语言:javascript
复制
var MyModel = Backbone.Model.extend({
  initialize: function() {
     myDefaults = {
       obj1: new Obj()
     } 
     this.set(myDefaults);
  }
});

有关完整的解释,请参阅c3ring的答案@ https://stackoverflow.com/a/6364480/1072653

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6351271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档