0

在一个集合中,我们如何改变模型的顺序?

这不是对模型进行排序,也不是编写比较器函数来实现排序顺序。

当从对象数组构建集合时,模型的顺序将是插入顺序。

现在我的问题是:在集合建立后,如何根据我的喜好改变模型的位置。

例如,在构建集合时,模型按照原始数组的顺序为:0、1、2、3、4、5。现在,我想更改顺序,如 2、4、0、1、3, 5.

4

2 回答 2

1

事实上,它归结为编写一个比较器——如果你想在集合中强加模型的某种顺序,你实际上是在对它们进行排序。要实现您想要的,似乎最简单的方法是向order模型添加一些属性,然后编写一个比较器来处理它。

于 2012-08-31T07:52:49.950 回答
0

我知道这是一篇旧帖子,但我有同样的帖子并想出了一个解决方案。简而言之,我的解决方案是将collection.models列表替换为包含相同模型的新列表,但按照我希望它的顺序...下面是我的用例和示例(使用咖啡脚本)。

注意:我不是 100% 确定这不会有问题,因为这会更改集合的列表,而不是就地对原始列表进行排序。但是我还没有找到故障模式,我已经测试了几个。

我的用例是一个可排序的 DOM 列表(通过jquery.ui/sortable)。我需要集合的顺序来反映 DOM 上显示的内容。

  1. 每个可排序的 DOM 元素都有一个data-cid对应于模型的属性,我在initialize每个Backbone.View列表项的方法中都这样做了。

    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. 该集合以与 cids 使用的顺序相同的顺序创建一个新的Backbone.Collection::get模型列表,然后用它替换它的模型列表。

    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
    
于 2016-01-07T01:04:13.703 回答