0

コレクションで、モデルの順序をどのように変更できますか?

これは、モデルを並べ替えたり、並べ替え順序を実現するためのコンパレータ関数を記述したりすることではありません。

コレクションがオブジェクトの配列から構築される場合、モデルの順序は挿入順序になります。

今私の質問は次のとおりです。コレクションが構築された後、私の好みに応じてモデルの位置を変更する方法。

たとえば、コレクションが作成されると、元の配列に従ってモデルの順序が0、1、2、3、4、5のようになります。次に、2、4、0、1、3のように順序を変更します。 5.5。

4

2 に答える 2

1

実際、それはコンパレーターを書くことに要約されます-コレクション内のモデルの特定の順序を課したい場合、あなたは実際にそれらをソートしています。order目的を達成するには、モデルに属性を追加してから、それに作用するコンパレーターを作成するのが最も簡単なようです。

于 2012-08-31T07:52:49.950 に答える
0

私はこれが古い投稿であることを知っていますが、私は同じものを持っていて、解決策を思いつきました。要するに、私の解決策は、collection.modelsリストを同じモデルを含む新しいリストに置き換えることですが、希望する順序で...以下は私のユースケースと例(コーヒースクリプトを使用)です。

注:これにより、元のリストがインプレースで並べ替えられるのではなく、コレクションのリストが変更されるため、これがバグにならないかどうかは100%わかりません。しかし、私はまだ障害モードを見つけておらず、いくつかテストしました。

私のユースケースは、(jquery.ui / sortableを介して)ソート可能なDOMリストでした。DOMに表示される内容を反映するために、コレクションの順序が必要です。

  1. 並べ替え可能な各DOM要素にはdata-cid、モデルに対応する属性があります。これは、各リストアイテムのinitializeメソッドで行いました。Backbone.View

    class ListItem extends Backbone.View
      ... 
      initialize: (options = {}) ->
        @$el.attr "data-cid", @model.cid
    
  2. 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
    
  3. コレクションは、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
    
于 2016-01-07T01:04:13.703 に答える