2012-08-31 87 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属性,然后编写一个处理它的比较器。