在将模型“设置”到集合中之后,骨干会触发事件

时间:2013-09-18 05:31:46

标签: javascript backbone.js underscore.js

我试图通过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方法

1 个答案:

答案 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([ ... ])

演示:http://jsfiddle.net/ambiguous/YytvS/