2013-02-22 42 views
0

我有,我想在時間排序顛倒消息的簡單集合(最新的放在上面),使用comparator比較器的集合排序只在提取完成後才起作用?

... 
this.comparator = function(message) { 
    var time = new Date(message.get("time")).getTime(); 
    return time; 
} 
... 

在我看來,我用fetchadd事件:

messages = new MessageCollection(); 
messages.fetch({update: true}); 
messages.on("add", this.appendMessage); 

... 

appendMessage: function(message) { 
    var messageView = new MessageView({ 
     model: message 
    }); 
    this.$el.prepend(messageView.render().el); 
} 

可悲的是,該消息沒有在我期待的順序呈現,但在原來的順序,他們在來自服務器。

現在,一些測試後,我發現,當我在一次(使用reset)添加的所有郵件,順序是如我所料。

messages.fetch(); 
messages.on("reset", this.appendCollection); 

... 

appendCollection: function(messages) { 
    messages.each(function(message) { 
     this.appendMessage(message); 
    }, this); 
} 

即使我能理解,因爲收集這個過程大概只能弄清楚它是如何應該被加入所有車型後進行排序,這(在on("add")配置)用於骨幹0.9.2工作。

我錯過了什麼嗎?比較方法是否改變了,或者是關於add的事件模型?還是我以錯誤的方式去做?謝謝!

+1

也許我失去了一些東西,但你調用'appendMessage'方法,當你在集合添加一個模型。 appendMessage是按照添加模型的順序調用的,而不是集合中的實際順序..沒有? – neebz 2013-02-22 12:44:19

+0

是的,我認爲你是對的,這也是Tallmaris所說的(下面)。如果您發佈的評論作爲一個答案,我會檢查它作爲公認的答案 – Phortuin 2013-02-22 14:11:23

+0

你可以讓你收集逆序排序後通過這樣做:http://stackoverflow.com/questions/5013819/reverse-sort-order- with-backbone-js /#21434708 – Fasani 2014-01-29 15:06:44

回答

1

你叫appendMessage方法,當你在集合添加一個模型。正在按照添加模型的順序調用appendMessage,而不是集合中的實際順序。

1

在「添加」的情況下,該模型被插入在收集在合適的位置,因爲它應該是由「comparator」文檔)。但是你在做

this.$el.prepend(messageView.render().el); 

這將使HTML從渲染消息查看在$ EL的頂部(我假設是的CollectionView容器)。

也讓HTML尊重的排序順序將重新呈現集合視圖,或滾動收集兒童觀和正確的地方插入附加消息查看,最好的辦法(多一點很難做到)。

+0

是的,完全正確。這一定是它。我目前的解決方案是在獲取完成後渲染集合,這也許是我本來應該做的。奇怪的是,我的原始解決方案是在Bb 0.9.2中工作,但不在0.9.10中。可能是一個幸運的事故 – Phortuin 2013-02-22 14:13:58