在一個集合中,我們如何改變模型的順序?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
屬性,然後編寫一個處理它的比較器。