Backbone Model数组属性更改和更改事件侦听器并不总是触发

Ber*_*ard 7 javascript backbone.js

我在Backbone中使用更改事件发现了一些奇怪的东西.这是一个模型,它有一个数组作为属性.如果我让属性在内部推送一个新值并将其设置回模型,则不会触发change事件...

这是一个完整记录的例子:

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
Run Code Online (Sandbox Code Playgroud)

Thx提前.

Sea*_*ana 15

hesson绝对正确:

JavaScript中的数组被视为指针,因此改变数组不会改变指针,也不会触发"更改"事件.

但是,作为替代解决方案(如果您还使用underscore.js),您可以这样做:

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

oTestModel.set('numbers', aNumbers); //Will trigger the changed:numbers event
Run Code Online (Sandbox Code Playgroud)

正如在这个类似问题的答案中看到的那样: Backbone.js:更改不在model.change()上触发

这将复制对象而不是使其成为引用,但嵌套对象或数组将只是引用.