我得到了这个“对象”
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);
}
还有其他方法吗?我无法想到原来的方式太难看了。
答案 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()函数来设置属性值。