3

オブジェクトのサブ属性に対してのみ 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 を使用してこれを行う方法はありますか?

4

1 に答える 1

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
于 2013-04-18T13:50:31.530 に答える