2012-11-01 86 views
6

我正在尋找一種優雅的方式,在添加模型時將模型添加到集合中。在Backbone源代碼中有一個unshift方法可以做到這一點,但用於將模型添加到集合的add方法太複雜,不能簡單地擴展。我正在建立一個依賴照片和推文的幻燈片放映,並且應該始終顯示最新的最新,最舊的最後一個。我的問題簡單化:將模型添加到集合

初始化程序,API調用返回:

apple, banana, lemon 

所以,蘋果最新的幻燈片。該集合構建的:

apple, banana, lemon 

間隔後,API調用檢查是否有新的水果,結果是:

orange 

收藏追加型號:

(apple, banana, lemon), orange 

這不是我想要的東西;橙色是最新的水果,之後是蘋果。但是,在這種情況下,我可以在添加幻燈片之前撤消最初的收藏集,並在繪製幻燈片時重新反向。現在,事情變得更加複雜(我加了括號來澄清):

API調用檢查甚至更多的水果:

pineapple, kiwi 

集合追加新車型一個接一個:

((apple, banana, lemon), orange), pineapple, kiwi 

所以現在從新到舊,我的收藏看起來像這樣:

((not so old, older, oldest), pretty new), brand new, new 

這絕對沒有意義:)

當然,更改API響應可能會使我的生活更輕鬆,但目前這不是一種選擇;另外,它應該無關緊要,因爲響應中的項目順序是新的 - >舊的,這對我來說很好。

我找不到一個開箱即用的解決方案,我不想通過將部分骨幹源克隆到unshift新模型來過度複雜化。建議?謝謝!

+1

'unshift'將不會如何工作?從文檔「在集合開始處添加模型,採用與添加相同的選項」。 – JayC

+0

由於我沒有手動向集合添加模型,我使用間隔從服務器獲取json,而Backbone將每個對象作爲模型追加到集合中。當然,我可以介入並使用'unshift',但這會使我的代碼複雜化(也許我應該指出,我的API endpont不是我的集合的真實代表,它是一種「流式」集合) – Phortuin

回答

5

如果模型具有與它們相關的某種日期或時間或者其他任何類型的排序(如果需要,您可以手動添加一個),則可以通過在集合中實現comparator函數對排序進行排序。參見:

http://backbonejs.org/#Collection-comparator

+1

Thanks !!不知道我在文檔中如何忽略它。問題解決了:'this.collection.comparator = function(model){return -model。獲得( 「時間」); }' – Phortuin

+0

對於那些遇到反向created_at比較器不工作的人,不要忘記在否定之前解析字符串! 'function(model){return -Date.parse(model.get('created_at'))}'' –