我试图通过set
方法将一批模型添加到集合后触发一个事件。我覆盖了set
方法,称为其父方设置方法,并在其中放置了一个console.log,它似乎触发了每个试图添加到集合中的模型。
class MyCollection extends Backbone.Collection
set: ->
super
console.log('set called')
我无法确定为什么会发生这种情况,但为了继续前进,我决定使用下划线debounce
方法将这些组合在一起并随后发起事件。这就是我想出来的
class MyCollection extends Backbone.Collection
initialize: ->
@batchComplete = _.debounce(@_batchComplete, 1000)
super
@
_batchComplete: =>
if not window.test
window.test = @
if window.test is @
console.log 'SAME AS PREVIOUS'
else
console.log 'DIFFERENT', window.test, @
window.test = @
@trigger('setComplete')
set: ->
super
@batchComplete()
@
我已创建此集合的实例并尝试使用set方法
c = new MyCollection
c.set([{...},{...},{...}])
我对此的期望是window.test
等于@
但是它们似乎引用了不同的位置。这是控制台中的示例输出
> DIFFERNT MyCollection, MyCollection
> DIFFERNT MyCollection, MyCollection
我不明白为什么window.test
与@
不同。由于每次迭代不相同,这意味着它没有调用相同的debounce
方法
答案 0 :(得分:0)
如果您真的在空集合上调用set
,那么您可以使用reset
代替:
重置
collection.reset([models], [options])
一次添加和删除模型一切都很好,但有时您需要更改很多模型,而只是批量更新集合。使用重置将集合替换为新的模型列表(或属性哈希值),最后触发单个
"reset"
事件。
所以你可以:
c = new MyCollection
c.on('reset', (collection) -> ...)
c.set([{...},{...},{...}])
你最后会收到一个'reset'
事件。
演示:http://jsfiddle.net/ambiguous/EVxM7/
如果reset
不合适,您可以使用_.after
:
在_.after(count, function)
之后
创建一个仅在首次被称为 count 次后才会运行的函数版本。
所以你可以这样做:
a = array_of_models
c = new Collection
c.on('add', _.after(a.length, (model, collection) -> ...)
c.set(a)
演示:http://jsfiddle.net/ambiguous/6SnSS/
您还可以覆盖set
并触发自定义事件并监听该自定义事件,以了解set
何时完成其工作:
class C extends Backbone.Collection
set: ->
super
@trigger('batch-done', @)
c = new C
c.on('batch-done', (collection) ->
console.log('All done', collection.toJSON())
)
c.set([ ... ])