我正在尝试做我希望是一件简单的事情 - 只在对象的子属性上做一个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做到这一点?
答案 0 :(得分:18)
你可以做到(我想知道你为什么没有设法做到这一点)。但你必须要小心:
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