2015-09-28 38 views
0

所以有一段功能,我一直在努力了一段時間。我使用.where()方法爲了從集合中檢索一個對象數組,然後用這個數組重新設置這個Collection。骨幹collection.reset()

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

當事件觸發它傳遞的。凡)方法選項(並開始復位過程:

# 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] ... } 

在負責渲染這個集合的查看我聽「復位」事件和渲染相應的視圖。

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

它的工作方式與預期相同:事件觸發,集合經歷重置,View重新呈現已重置集合。但是當事件第二次觸發時,集合不會與服務器同步,並且new_models = collection.where(options)接收到已在上一次事件運行中重置的集合並返回一個空數組。

我在這裏有什麼選擇?每個事件運行我需要所有模型的初始集合。我是否應該在每次運行中請求集合的新實例,或者我可以以更清潔的方式進行操作,即將原始狀態保存在某處並傳遞給事件運行,而不是從服務器獲取新集合?請指教。

+0

什麼是重置收集點?您可以在骨幹中使用自定義事件來在從集合中找到經過濾的一組模型後觸發函數。通過這種方式,您的原始收藏品未受影響。並可以用不同的選項進行過濾。 –

+0

嗯,我一般都是Backbone和JavaScript的新手,但就我的理解而言,我必須將有效的Backbone Collection傳遞給視圖。雖然.where()方法返回一個對象數組,但我使用reset來重新填充這些對象的集合,並將它們轉換爲一組模型。我非常樂意接受任何建議和指導,如果有更好的方法來處理它,請告訴我們。 @manasisakhare –

回答

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);