2012-08-31 89 views
0

在一個集合中,我們如何改變模型的順序?Backbone:如何更改模型的順序

這不是關於排序模型或編寫比較函數來實現排序順序。

當從一個對象數組構建集合時,模型的順序將是插入順序。

現在我的問題是:建立集合後,如何根據自己的喜好更改模型的位置。

例如, 當收集建立的模型作爲每原始陣列等順序:0,1,2,3,4,5。 現在,我想改變順序等2,4, 0,1,3,5.

回答

0

我知道這是一箇舊帖子,但我有相同的一個,並提出了一個解決方案。簡而言之,我的解決方案是用包含相同模型的新列表替換collection.models列表,但按照我希望它的格式列出...下面是我的用例和示例(使用咖啡腳本)。

注意:我不是100%確定這不會是越野車,因爲這改變了集合的列表,而不是原地排列原始列表。但是我還沒有找到失敗模式,我測試了幾個。

我的用例是一個可排序的DOM列表(通過jquery.ui/sortable)。我需要該集合的順序來反映DOM上顯示的內容。

  1. 每個排序DOM元件具有對應於所述模型data-cid屬性,我在每個Backbone.View列表項的方法initialize這樣做。

    class ListItem extends Backbone.View 
        ... 
        initialize: (options = {}) -> 
        @$el.attr "data-cid", @model.cid 
    
  2. Backbone.View(無序列表)監聽到sortupdate事件(用戶分類的東西),然後構造新秩序CID列表,並進入收集此進行排序。

    class List extends Backbone.View 
        ... 
        tagName: "ul" 
        events: 
        "sortupdate" : "sort" 
    
        render: -> 
        @$el.html("") # reset html 
        @collection.each (model) => 
         view = new ListItem model: model 
         @$el.append view.render().$el 
        return @ 
    
        sort: (e, ui) -> 
        e.stopPropagation() 
        orderByCid = @$el.children().map(-> $(@).attr "data-cid") 
        @collection.orderModels orderByCid 
    
  3. 的收集使得在相同的順序使用Backbone.Collection::get的CID組模型一個新的列表,然後替換其型號列表與此有關。

    class DataList extends Backbone.Collection 
        ... 
        orderModels: (cids = []) -> 
        # Add validation that all the cids exist in the collection 
        # and that list and collection are the same length! 
        result = [] 
        result.push @get(cid) for cid in cids 
        @models = result 
    
1

事實上,它歸結爲編寫一個比較器 - 如果你想在集合中強加一定的模型順序,你實際上是在對它們進行排序。爲了達到你想要的效果,最簡單的方法是在模型中添加一些order屬性,然後編寫一個處理它的比較器。