Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干:如何更改模型的顺序_Backbone.js - Fatal编程技术网

Backbone.js 主干:如何更改模型的顺序

Backbone.js 主干:如何更改模型的顺序,backbone.js,Backbone.js,在集合中,如何更改模型的顺序 这不是对模型进行排序,也不是编写比较器函数来实现排序顺序 从对象数组生成集合时,模型的顺序将是插入顺序 现在我的问题是:在集合构建之后,如何根据我的偏好更改模型的位置 比如说,, 构建集合时,按照原始数组对模型进行排序,如:0、1、2、3、4、5。 现在,我想改变顺序,比如2,4,0,1,3,5。事实上,它可以归结为编写一个比较器——如果你想在集合中对模型施加一定的顺序,你实际上是在对它们进行排序。要实现您想要的,似乎最简单的方法是向模型添加一些顺序属性,然后编写一

在集合中,如何更改模型的顺序

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

从对象数组生成集合时,模型的顺序将是插入顺序

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

比如说,, 构建集合时,按照原始数组对模型进行排序,如:0、1、2、3、4、5。
现在,我想改变顺序,比如2,4,0,1,3,5。事实上,它可以归结为编写一个比较器——如果你想在集合中对模型施加一定的顺序,你实际上是在对它们进行排序。要实现您想要的,似乎最简单的方法是向模型添加一些
顺序
属性,然后编写一个比较器来处理它。

我知道这是一篇老文章,但我也有同样的文章,并提出了解决方案。简而言之,我的解决方案是用一个新列表替换
collection.models
列表,该列表包含相同的模型,但按我希望的顺序排列。。。下面是我的用例和示例(使用coffee脚本)

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

我的用例是一个可排序的DOM列表(via)。我需要集合的顺序来反映DOM上显示的内容

  • 每个可排序的DOM元素都有一个与模型对应的
    数据cid
    属性,我在每个
    主干的
    初始化
    方法中这样做。查看
    列表项

    class ListItem extends Backbone.View
      ... 
      initialize: (options = {}) ->
        @$el.attr "data-cid", @model.cid
    
  • 父级
    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
    
  • 集合使用
    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