在一个集合中,我们如何改变模型的顺序?Backbone:如何更改模型的顺序
这不是关于排序模型或编写比较函数来实现排序顺序。
当从一个对象数组构建集合时,模型的顺序将是插入顺序。
现在我的问题是:建立集合后,如何根据自己的喜好更改模型的位置。
例如, 当收集建立的模型作为每原始阵列等顺序:0,1,2,3,4,5。 现在,我想改变顺序等2,4, 0,1,3,5.
在一个集合中,我们如何改变模型的顺序?Backbone:如何更改模型的顺序
这不是关于排序模型或编写比较函数来实现排序顺序。
当从一个对象数组构建集合时,模型的顺序将是插入顺序。
现在我的问题是:建立集合后,如何根据自己的喜好更改模型的位置。
例如, 当收集建立的模型作为每原始阵列等顺序:0,1,2,3,4,5。 现在,我想改变顺序等2,4, 0,1,3,5.
我知道这是一个旧帖子,但我有相同的一个,并提出了一个解决方案。简而言之,我的解决方案是用包含相同模型的新列表替换collection.models
列表,但按照我希望它的格式列出...下面是我的用例和示例(使用咖啡脚本)。
注意:我不是100%确定这不会是越野车,因为这改变了集合的列表,而不是原地排列原始列表。但是我还没有找到失败模式,我测试了几个。
我的用例是一个可排序的DOM列表(通过jquery.ui/sortable)。我需要该集合的顺序来反映DOM上显示的内容。
每个排序DOM元件具有对应于所述模型data-cid
属性,我在每个Backbone.View
列表项的方法initialize
这样做。
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
事实上,它归结为编写一个比较器 - 如果你想在集合中强加一定的模型顺序,你实际上是在对它们进行排序。为了达到你想要的效果,最简单的方法是在模型中添加一些order
属性,然后编写一个处理它的比较器。