Backbone collection.reset()

时间:2015-09-28 00:38:02

标签: javascript backbone.js marionette

所以有一段功能我现在已经苦苦挣扎了一段时间。我正在使用.where()方法从Collection中检索一个对象数组,然后用这个数组重置这个Collection。

    # Fetch the collection
    collection = App.request(collection:entites)
    console.log collection
    >collection {length: 25, models: Array[25] ... }

当事件触发时,它会传递.where()方法的选项并启动重置过程:

    # Get new models
    new_models = collection.where(options)

    # Reset collection with the new models
    collection.on 'reset', (model, options) ->
        console.log options.previousModels
        return

    collection.reset(new_models)
    console.log collection
    >collection {length: 5, models: Array[5] ... }

在负责渲染此集合的View中,我听取'reset'事件并相应地渲染View。

    initialize: ->
        @listenTo(@collection, 'reset', @render)

它按预期工作:事件触发,集合重置,View重新呈现重置集合。但是当事件第二次触发时,集合不会与服务器同步,而new_models = collection.where(options)会收到一个已在先前事件运行中重置的集合,并返回一个空数组。

我有什么选择?每个事件运行我需要一个所有模型的初始集合来使用。我应该在每次运行时只是请求集合的新实例,还是可以以更清洁的方式进行处理,即将原始状态保存在某处并将其传递给事件运行而不是从服务器获取新集合?请指教。

1 个答案:

答案 0 :(得分:0)

是。实现它的另一种方法是,当您使用.where()过滤集合时,您可以触发您查看可以侦听的Backbone.Events自定义事件。这样,原始集合不会重置,只有数组的更改才会触发自定义事件。

在骨干网中使用自定义事件的示例代码是:

var object = {};

_.extend(object, Backbone.Events);

object.on("collectionFiltered", function(arrayOfFilteredModels) {
  // do stuff to render your view with the new set of array.
  // You can use underscore templating to traverse the array for rendering view.
});

object.trigger("collectionFiltered", collection.where(options);