我正在尝试做我希望做的一件简单的事情——只在对象的子属性上做一个 model.set。
现在,我有一个看起来像这样的模型:
{
"attr1" : true,
"attr2" : this.model.get("username"),
"attr3" : $('#tenant_select').val(),
"attr_array": [
{
"id": "sub_1",
"state": "active"
},
{
"id": "sub_22",
"state": "not_active"
}
]
}
我希望能够访问 myMode.attr_array.state 并更改值。但是,使用 .set 我只能更改第一级的属性,即 attr_array。
有没有办法使用 model.set 来做到这一点?
最佳答案
你可以做到(我想知道你为什么没能做到)。但是你必须要小心:
var array = this.get('attr_array');
array[1].state = 'active';
this.set('attr_array', array);
这里有什么问题?您的模型包含对象的引用。因此最后一行是无用的,它根本不会改变任何东西。它简单地等同于:
this.get('attr_array')[1].state = 'active';
当你使用 set 时,你会丢失 Backbone 所做的任何内部工作。
那么该怎么办?克隆你的对象:
var array = _.clone(this.get('attr_array'));
array[1].state = 'active';
this.set('attr_array', array); // will trigger 'change' and 'change:attr_array' events
关于javascript - 在 Backbone 中使用 model.set 更改嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084661/