Backbone.js 主干:如何更改模型的顺序
在集合中,如何更改模型的顺序 这不是对模型进行排序,也不是编写比较器函数来实现排序顺序 从对象数组生成集合时,模型的顺序将是插入顺序 现在我的问题是:在集合构建之后,如何根据我的偏好更改模型的位置 比如说,, 构建集合时,按照原始数组对模型进行排序,如:0、1、2、3、4、5。Backbone.js 主干:如何更改模型的顺序,backbone.js,Backbone.js,在集合中,如何更改模型的顺序 这不是对模型进行排序,也不是编写比较器函数来实现排序顺序 从对象数组生成集合时,模型的顺序将是插入顺序 现在我的问题是:在集合构建之后,如何根据我的偏好更改模型的位置 比如说,, 构建集合时,按照原始数组对模型进行排序,如:0、1、2、3、4、5。 现在,我想改变顺序,比如2,4,0,1,3,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