主干模型数组属性更改和更改事件侦听器不总是启动
Backbone Model array property change and change event listener not always firing
我在使用更改事件的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
提前Thx。
hesson关于是绝对正确的
JavaScript中的数组被视为指针,因此更改数组不会更改指针,也不会触发"更改"事件。
然而,作为另一种解决方案(如果您也使用underline.js),您可以执行以下操作:
var aNumbers = _.clone(oTestModel.get('numbers'));
aNumbers.push(5);
oTestModel.set('numbers', aNumbers); //Will trigger the changed:numbers event
正如这个类似问题的答案所示:Backbone.js:change未在模型上启动。change()
这将复制对象,而不是使其成为引用,但是嵌套的对象或数组将只是引用。
JavaScript中的数组被视为指针,因此更改数组不会更改指针,也不会触发"更改"事件。相反,您需要设置一个方法,在该方法中对数组进行变异,并且在这个方法中,您触发自己的自定义事件。例如:
mutateArray: function() {
var numbers = this.get("numbers");
numbers.push(5);
this.trigger("mutatedarray");
return this;
}
请注意,因为数字是一个指针,所以调用set是没有意义的(并非双关语),因为数字只是对数组的引用。然后,您可以通过监听自定义mutatedarray事件来监听更改,如下所示:
this.on("mutatedarray", this.changedEvent, this);
相关文章:
- Highslide(iframe的侦听器)
- 如何在for循环中添加事件侦听器
- 选项卡侦听器未被来自后台脚本的消息激活
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 事件侦听器未在chrome扩展中的options.js中启动
- jQuery事件侦听器多次启动
- 事件侦听器,用于完全关闭后重新启动的应用程序
- 使用javascript手动更改表单/文本区域输入,并确保所有事件侦听器都已启动
- JQuery事件侦听器未启动-Phonegp/谷歌地图
- 单击链接时的 Javascript 操作顺序 - 链接启动或附加到 id 的侦听器触发
- 触摸启动阻止按钮侦听器
- 单击事件侦听器不会启动转换/转换
- jQuery事件侦听器在应用选择器之前启动
- 如果在jquery.slideDown()动画结束之前,Javascript侦听器未启动
- jQuery事件委托侦听器未启动
- 主干模型数组属性更改和更改事件侦听器不总是启动
- Vimeo播放事件侦听器在单击“播放”按钮之前启动
- 为什么此节点csv解析器事件侦听器从未启动
- Chrome运行时OnMessage侦听器事件未启动