2013-01-07 247 views
0

我正在使用幾個主幹集合,有時需要根據某些條件訪問其中的一部分。篩選Backbone.js集合

方法1

正如this question已經說過,在自己返回的模式陣列,而不是另一個集合的集合使用filter()。這可以在簡單的情況下工作,但它具有丟失集合的方法連接的效果,因爲普通的模型數組不會具有集合中定義的所有方法。

方法2

的回答這個問題建議設立一個新的集合的車型陣列傳遞給構造函數。這可以起作用,但每次都會調用集合的構造函數,所以每次過濾集合時,可能在其中定義的任何事件綁定都會堆疊起來。

那麼根據某些過濾條件創建子集合的正確方法是什麼?

我應該使用方法1並創建更多的過濾方法,而不是依靠方法鏈接嗎?

我應該使用方法2並避免在集合的構造函數中綁定事件嗎?

回答

1

就我個人而言,我會在集合上創建更多的過濾方法,因爲它具有在集合中封裝邏輯的額外好處。

您也可以嘗試重新使用現有的集合。我玩弄與周圍的想法,來到這樣的事情:

var Collection = Backbone.Collection.extend({ 
    //Takes in n arrays. The first item of each array is the method you want 
    //to call and the rest are the arguments to that method. 
    //Sets the collection.models property to the value of each successive filter 
    //and returns the result of the last. Revers the collection.models to its original value. 
    chainFilters: function(/*args..*/) { 
    var models = this.models; 
    try { 
     filters = _.toArray(arguments); 
     _.each(filters, function(filter) { 
     this.models = filter[0].apply(this, _.rest(filter)); 
     }, this); 
    } catch(err) { 
     this.models = models; 
     throw err; 
    } 

    var filtered = this.models; 
    this.models = models; 
    return filtered; 
    } 
}); 

用法:

var results = collection.chainFilters(
    [ collection.filter, function(model) { return model.get('name') === 'foo'; } ], 
    [ collection.someMethod, 'someargument' ], 
    [ collection.someOtherMethod ] 
); 

Here's a working sample.這是一個有點特殊的,我知道。

0

這取決於用例。如果你希望這些模型更新視圖,那麼你可能需要一個新的集合,否則你不會得到很好的反應模板更新。如果您只是希望模型遍歷或操作數據而不必擔心數據更新,請使用數組+ underscore.js。

嘗試使用數組,如果您發現自己編寫了很多帶有功能的鍋爐板代碼,但是不在underscore.js中,只需開始使用集合。