更新arrays时模型的更改事件不会触发?

使用backbone.js ……

@model.bind 'change', ()-> console.log 'updated' addIndex = (index) => array = @model.get('array') array.push index @model.set array: array 

这会完美更新模型,但不会触发更改事件。 有谁知道为什么从我发布的内容?

编辑:

我添加了这个并触发了change事件:

 @model.set test: '' num = 0 setInterval ()=> num++ @model.set test: num , 3000 

我添加了这个并且它不会触发更改事件:

 @model.set test: [] num = 0 setInterval ()=> console.log 'testupdate' num++ test = @model.get('test') test.push num @model.set test: test , 3000 

布莱恩的答案原因很棒!

想要提供另一种方法来获得你想要的东西,而不是将其归零或克隆数组。

只需自己手动触发更改:

 addIndex = (index) => array = @model.get('array') array.push index @model.trigger('change:array',@model, array) 

由于您要设置引用的对象,请使用_.clone()

 test = _.clone @model.get('test') test.push num @model.set test: test 

由于您不再使用引用的对象/数组来设置自身,因此如果更改事件已更改,它将触发更改事件。

问题是您使用现有值设置值。 看一下源代码:

http://documentcloud.github.com/backbone/docs/backbone.html#section-33

当你调用set它有一个guard子句,以确保你没有设置相同的值(以避免事件循环)。 在您的情况下,您将获取arrays,修改它并再次设置它,这不会触发您的事件。

当然,当你set test: {} ,它是一个带有新对象的新项,因此它会再次触发。 如果您真的想要触发事件,可以将其设置为null,然后将其设置为空数组,然后再次设置为填充的数组…

更改对象或数组时,另一种方法是在设置新的更新值之前静默取消设置属性。 像这样的东西:

 (function() { var arr, model = new Model(); model.set( "arrayProp", [1, 2, 3] ); arr = model.get( "arrayProp" ); arr.push( 4 ); model.unset( "arrayProp", { silent: true } ); model.set( "arrayProp", arr ); })(); 

通过设置silent: true当取消设置prop时,change事件将只触发一次(当调用set()方法并且属性已更新时)。

这样做或手动调用事件之间没有什么区别,这只是个人偏好的问题。

你能考虑使用Backbone集合而不是数组,然后绑定到更改该集合中的事件吗?