Javascript 主干模型阵列属性更改和更改事件侦听器不总是触发
我在主干中发现了一些奇怪的变化事件。 它是一个以数组为属性的模型。 如果我得到属性,在里面推一个新值,并将其设置回模型,则不会触发更改事件 下面是一个完整的文档化示例:Javascript 主干模型阵列属性更改和更改事件侦听器不总是触发,javascript,backbone.js,Javascript,Backbone.js,我在主干中发现了一些奇怪的变化事件。 它是一个以数组为属性的模型。 如果我得到属性,在里面推一个新值,并将其设置回模型,则不会触发更改事件 下面是一个完整的文档化示例: var TestModel = Backbone.Model.extend({ defaults : { numbers : [] }, initialize : function() { this.on('change:numbers', this.changedEve
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
提前Thx。JavaScript中的数组被视为指针,因此改变数组不会更改指针,也不会触发“更改”事件。相反,您需要设置一个方法,在该方法中对数组进行变异,并在该方法中触发您自己的自定义事件。例如:
mutateArray: function() {
var numbers = this.get("numbers");
numbers.push(5);
this.trigger("mutatedarray");
return this;
}
注意,因为数字是一个指针,所以调用set(不是双关语)是没有意义的,因为数字只是对数组的引用。然后,您可以通过如下方式侦听自定义mutatedarray事件来侦听更改:
this.on("mutatedarray", this.changedEvent, this);
hesson在以下方面绝对正确:
JavaScript中的数组被视为指针,因此改变数组不会改变指针,也不会触发“更改”事件 但是,作为替代解决方案(如果您也使用下划线.js),您只需执行以下操作:
var aNumbers = _.clone(oTestModel.get('numbers'));
aNumbers.push(5);
oTestModel.set('numbers', aNumbers); //Will trigger the changed:numbers event
从这个类似问题的答案中可以看出:
这将复制对象,而不是将其作为引用,但是嵌套对象或数组将仅作为引用。感谢您帮助我在大型对象上使用
。
是否会显著提高性能?是的,因为您正在添加自定义代码来解决此问题,最好添加触发事件的代码:oTestModel.trigger('change:numbers',oTestModel,aNumbers)
根据您的事件订阅者,您可能还需要触发常规的“change”事件oTestModel.trigger('change',oTestModel)
,或者两者都触发才能安全。