【问题标题】:Changing nested attribute with model.set in Backbone在 Backbone 中使用 model.set 更改嵌套属性
【发布时间】:2013-04-18 13:43:10
【问题描述】:

我正在尝试做一件我希望是简单的事情——只在对象的子属性上做一个 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 做到这一点?

【问题讨论】:

  • 我敢打赌,如果你只是 .get() "attr_array" 的值并修改数组内容,那会奏效。
  • 这行得通,但问题是我想保持里面所有东西的顺序,现在我的解决方案不断地重新排序

标签: javascript json backbone.js marionette backbone-model


【解决方案1】:

你可以做到(我想知道你为什么没能做到)。但你必须小心:

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

【讨论】:

  • 啊,克隆成功了。我有一个修复工作,就像你提到的第一个一样,但最后一个是完美的!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多