Backbone:如何更改模型的顺序

时间:2012-08-31 07:47:22

标签: backbone.js

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

这不是关于对模型进行排序,也不是为了实现排序顺序而编写比较器函数。

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

现在我的问题是:在构建集合之后,如何根据我的偏好更改模型的位置。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

注意:我不是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. 该集合使用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