7

変更イベントを使用して Backbone で奇妙なことを発見しました。プロパティとして配列を持つモデルを使用しています。そして、プロパティを取得して新しい値を内部にプッシュし、それをモデルに戻すと、変更イベントは発生しません...

完全に文書化された例を次に示します。

var TestModel = Backbone.Model.extend({
    defaults : {
        numbers : []
    },

    initialize : function() {
        this.on('change:numbers', this.changedEvent);
    },

    changedEvent : function() {
        console.log('model has changed');
    }
});

var oTestModel = new TestModel();
    oTestModel.set('numbers', [2, 3, 4]);    // change:numbers Event is fired

var aNumbers = oTestModel.get('numbers');
    aNumbers.push(5);

oTestModel.set('numbers', aNumbers);    // change:numbers event is NOT fired BUT WHY???

// oTestModel.set('numbers', [2, 3, 4]); 
// If this line is not commented out change:numbers event is also fired

console.log(oTestModel.toJSON());  // Dumps out [2,3,4,5] Respective [2,3,4] if line above is not commented out

事前にt​​hx。

4

2 に答える 2

3

JavaScript の配列はポインターとして扱われるため、配列を変更してもポインターは変更されず、「変更」イベントは発生しません。代わりに、配列を変更するメソッドをセットアップする必要があります。このメソッドでは、独自のカスタム イベントをトリガーします。例えば:


mutateArray: function() {
    var numbers = this.get("numbers");
    numbers.push(5);
    this.trigger("mutatedarray");
    return this;
}

数値はポインターであるため、 set を呼び出すのは無意味であることに注意してください (しゃれは意図されていません)。数値は配列への参照にすぎないためです。次に、次のようにカスタム mutatedarray イベントをリッスンすることで、変更をリッスンできます。


this.on("mutatedarray", this.changedEvent, this);
于 2013-08-09T01:04:44.337 に答える