2

以下は私のcoffeescriptコードの一部です

class Floor extends Backbone.Model
    defaults:
        "array":[]

    initialize: ->
        a = []
        for i in [0..10] by 1
            tmp = {
                x: i*10,
                y: i*10
            }
            a.push(tmp)
        this.set('array', a)

class FloorView extends Backbone.View
    initialize: ->
        this.model.on('change:array', this.renderArray, this) 

    renderArray: ->
        console.log 'Do something'
        return this

floor1 = new Floor
floorView = new floorView({ model:floor1})

次の 3 行は、renderArray メソッドを呼び出す変更イベントを発生させません。

array = floor1.get('array')
array[0].x = 1000;
floor1.set('array',array)

しかし、次のコードは実際に renderArray メソッドを呼び出します

floor1.set('array',{});

配列内のオブジェクトの変更されたプロパティを検出する方法はありますか?

または私が間違ったことをしましたか?

4

1 に答える 1

1

次のように考えることができます。「配列」は、配列を指す変数名です。これを行う場合:

floor1.set('array', []);

「配列」がまったく別の配列を指しています。ただし、これを行うと:

array = floor1.get('array')
array[0].x = 1000;
floor1.set('array', array)

「配列」がすでに指している配列を更新しています。つまり、「配列」が指す配列を変更していません。代わりに、既存の配列内の値を変更しています。

この Q&A にはさらに背景があります: Backbone.js : model.change() で変更が発生しない

そして、この回避策を指摘しています:

array = floor1.get('array')
array[0].x = 1000;
floor1.set('array', array)
floor1.trigger('change:array')
于 2012-12-07T07:13:48.970 に答える