2013-06-05 128 views
3

我想通過backbone.js添加到我的集合的動態排序。使用Backbone.js排序集合

初始化時,集合具有默認排序並呈現視圖。我做了一個按鈕來測試如何改變排序。它調用以下功能:

app.productList.comparator = function(product) { 
    return parseFloat(product.get("price")); 
}; 
app.productList.sort(); 

如果我理解正確的集合現在應該排序,但視圖仍然需要刷新。我的文檔和in this topic在讀來監聽sort事件

window.ProductCollection = Backbone.Collection.extend({ 
    model:Product, 
    localStorage: new Backbone.LocalStorage("ProductCollection"), 

    events:{ 
     "sort":"test" 
    }, 

    test:function(){ 
     alert('test'); 
    } 
}); 

出於測試目的,我添加了一個簡單的警報,但是這不顯示。所以看起來排序事件沒有被觸發。

任何想法我在做什麼錯在這裏?

回答

4

Backbone.Collection沒有考慮像Backbone.View這樣的事件散列,你必須自己綁定事件。你可以使用initialize方法來做到這一點,像

var ProductCollection = Backbone.Collection.extend({ 
    model:Product, 

    initialize: function() { 
     this.on('sort', this.test); 
    }, 

    test: function(){ 
     console.log('test'); 
    } 
}); 

並演示http://jsfiddle.net/nikoshr/fTwpf/

1

默認情況下,沒有比較的集合。如果您定義了一個比較器,它將用於按排序順序維護集合。這意味着隨着模型的添加,它們被插入到collection.models的正確索引處。可以將一個比較器定義爲sortBy(傳遞一個接受單個參數的函數),作爲一個排序(傳遞一個比較函數,該函數需要兩個參數),或者作爲指示要排序的屬性的字符串。

「sortBy」比較器函數採用一個模型並返回一個數字或字符串值,通過該值可以將模型相對於其他模型排序。 「排序」比較函數需要兩個模型,如果第一個模型應該在第二個模型之前返回-1,如果它們具有相同的等級,則返回0;如果第一個模型應該在第二個模型之後,則返回1。

注意如何,即使所有在這個例子中的章節都向後加入,他們在正確的順序出來:

var Chapter = Backbone.Model; 
var chapters = new Backbone.Collection; 

chapters.comparator = function(chapter) { 
    return chapter.get("page"); 
}; 

chapters.add(new Chapter({page: 9, title: "The End"})); 
chapters.add(new Chapter({page: 5, title: "The Middle"})); 
chapters.add(new Chapter({page: 1, title: "The Beginning"})); 

alert(chapters.pluck('title')); 

收藏有比較不會自動重新排序如果以後更改模型屬性,因此您可能希望在更改會影響訂單的模型屬性後調用排序。

強制集合重新排序。在正常情況下,您不需要調用此函數,因爲只要添加了模型,帶比較器的集合就會自行排序。要在添加模型時禁用排序,請傳遞{sort:false}進行添加。調用排序會觸發集合上的「排序」事件。

+0

感謝您對{{:false}}有用的珍聞! – khalid13