2012-05-22 65 views
2

我希望能夠在向模型添加模型後對數據進行排序。如果我不適用silent:true收集將渲染,但一切雙打。有另一種方法嗎?在骨幹收集中添加模型後自動排序

我在初始化函數上呈現模板並在重置後呈現集合子視圖。

+0

一些代碼總是有幫助的,所以我們可以看到你以前試過。 –

+2

@Dreyfus總是有'比較器'功能來保持您的模型始終排序。 – Deeptechtons

+0

是的。但我的主要問題在於渲染部分。如果我有1,2,3集合,如果我使用排序而不清除DOM,結果將是1,2,3,1,2,3 – jongbanaag

回答

1

得到它的工作,雖然我會回答我的問題,因爲我不知道這是最好的答案,所以歡迎評論。

對我的看法

initialize : function(){ 
     this.$el.html(this._template); 
     this.collection.bind('reset', this.LoadItems, this); 
     this.collection.bind('add', this.AddOneItem, this); 
     $("#settings-category").trigger("create"); 
    }, 

    LoadItems : function(){ 
     this.collection.each(function(model){ 
      this.view = new CurrentCategoryView({model : model}); 
      $("#currentCategoryListContainer").append(this.view.render().el); 
     }); 
     $("#currentCategoryListContainer").listview("refresh"); 
    }, 

這導致對DOM元素的正常渲染,但如果我使用排序,最終觸發復位的上方,其結果是,它不我的函數不包括代碼不清理DOM元素並繼續添加更多元素,導致Collection模型被渲染兩次。所以這是我的解決方案。

$("#currentCategoryListContainer").empty(); 
this.collection.sort(); 

這樣我清除了已被佔用DOM讓位給新的項目(分類項目)進行渲染。

+0

DOM.empty()的唯一問題是用戶將感受到屏幕上的_flash_,他將丟失任何受此DOM刪除影響的滾動位置。 – fguillen

+0

我遇到了同樣的問題。有更好的解決方案嗎? – CamelBlues

+0

同樣在這裏!我們如何解決它? – Makromat

2

只實現一個比較:

Backbone.Collection.extend({ 

    // ... 

    comparator: function(doc) 
    { 
     var str = doc.get('name') || ''; 
     return str.toLowerCase(); 
    }, 

    // ... 

});