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