在一个系列中,我们如何改变模型的顺序?
这不是关于对模型进行排序,也不是为了实现排序顺序而编写比较器函数。
当从一组对象构建集合时,模型的顺序将是插入顺序。
现在我的问题是:在构建集合之后,如何根据我的偏好更改模型的位置。
例如, 构建集合时,按照原始数组的模型顺序如:0,1,2,3,4,5。 现在,我想改变顺序,如2,4,8,1,3,5。
答案 0 :(得分:1)
实际上它归结为编写一个比较器 - 如果你想在集合中强加某个模型的顺序,你实际上是在对它们进行排序。要实现您想要的效果,最简单的方法是在模型中添加一些order
属性,然后编写一个比较器来处理它。
答案 1 :(得分:0)
我知道这是一个老帖子,但我有同样的帖子,并想出了一个解决方案。简而言之,我的解决方案是将collection.models
列表替换为包含相同模型的新列表,但按照我希望它的顺序替换...以下是我的用例和示例(使用咖啡脚本)。< / p>
注意:我不是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
该集合使用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