2012-08-08 32 views
5

我有一個名單和日期待辦事項列表。我希望能夠使用標題或日期對列表進行排序。我將如何做到這一點?比較器只允許一種類型的排序。Backbone.js集合與多種排序

謝謝。

+1

我可以問爲什麼你不想重置集合?出於這個確切原因,重置觸發器(針對視圖)。即當您的排序通過重置進行更改時,您的視圖將重新呈現。 – 2012-08-08 18:39:05

+0

你說得對,我認爲重新設定整個系列沒有任何缺點。謝謝。 – chenglou 2012-08-08 18:44:07

+0

當數據發生變化時,對集合進行「重置」是很正常的事情,對於整個集合,即使它是相同的數據但是順序不同 – 2012-08-08 18:50:09

回答

1

我想我找到了一個方法:

collection.reset(collection.sortBy(function(item){ 
    return item.get(sortingFIeld); 
})) 

凡sortBy返回作爲參數復位通過了新的,分類排列。 SortingField是模型的字符串屬性。

+0

他特別表示他不想使用重置。現在他編輯出來了:P不是你的錯。 – 2012-08-08 18:39:29

+1

我是我雖然哈哈。我編輯了這個,因爲那一刻我就能想到這個解決方案。 – chenglou 2012-08-08 18:42:42

+0

你能擴展你的答案嗎?我正在處理同樣的事情,並想知道在哪裏指定要排序的屬性(標題或日期)。 – CamelBlues 2012-08-08 22:05:14

3

您可能需要看看the answer here,這裏是該職位所提供的解決方案:

comparator: function(item) { 
    return [item.get("level"), item.get("title")] 
} 
4

它可以實現更多的邏輯到比較器,這樣就可以抽象掉一些排序邏輯的:

var Collection = Backbone.Collection.extend({ 

    model: myModel, 
    order: 'name' 

    comparator: function(model) { 
     if (this.order === 'name') { 
      return model.get('name'); 
     } else { 
      return model.get('date'); //or modify date into a numeric value 
     } 
    } 
}); 

然後改變你想要的排序:

myCollection.order = 'date'; 
myCollection.sort(); 

這將調用比較器功能並按此方式對其進行排序。

你可以聆聽到一個視圖再整理:

this.listenTo(myCollection,'sort',this.render); 

這有一個好處,每次添加一種模式時,它會調用比較器和使用任何你目前的設置是排序的,因爲排序方法存儲在集合中。

+0

+1這個答案。選項是你如何在你的應用程序之間傳遞函數所需的信息。 – Throttlehead 2013-11-25 17:50:11