在Javascript + BackBone中设置这是正确的方法吗?

时间:2012-01-11 12:51:49

标签: javascript syntax backbone.js

我得到了这个“对象”

Person = Backbone.Model.extend({
    defaults: {
        name: 'Fetus',
        age: 0,
        children: []
    },
    initialize: function() {
        this.bind("change:name", function() {
            var name = this.get("name");
            alert("Changed my name to " + name);
        });
    },
    adopt: function(newChildsName) {
        this.get("children").push(newChildsName);
    },
    setName: function(name) {
        this.set({
            name: name
        });
    }
});

无法像这样设置方法setName: 我试过但是他们不工作

setName: function(name){
  this.get(name) = name;
}

setName: function(name){
  this[name].set(name);
}

还有其他方法吗?我无法想到原来的方式太难看了。

2 个答案:

答案 0 :(得分:3)

为清楚起见,我将参数名称更改为newName。虽然:

this.set({name: newName});

表示:使用新值name参数(正确)设置名为newName的属性的值,此格式为:

setName: function(newName){
  this.get(newName) = newName;
}

什么都不做。它获取一个属性,其名称在newName参数中提供并返回它。作业无效。

另一方面,这个:

setName: function(newName){
  this[newName].set(newName);
}

可能会抛出错误。 this是一个Backbone模型对象。它包含attributes属性,因此可能:

this.attributes[newName] = newName;

更合理(将名称在newName参数中传递的属性更改为newName值。但在这种情况下,change事件不会被触发。但我猜,这就是你真正想要的:

setAttr: function(name, value){
  var diff = {};
  diff[name] = value;
  this.set(diff);
}

在这种情况下,您可以致电:

model.setAttr('id', 7);

相当于:

model.setAttr({id: 7});

并正确触发change:id

答案 1 :(得分:1)

原始方式对我来说最好。您必须在Backbone的事件系统模型上调用set()才能正常工作。您的两个示例没有多大意义(即为值赋值,并在值而不是模型上调用set()。)

我实际上认为添加自己的setName方法有点奇怪。任何编程Backbone.js的人都应该知道在模型实例上使用内置的set()函数来设置属性值。