14

でコレクションをソートしようとしていますMarionette.CompositeView
次のようなコレクションがあります。

[
   {id: 1, name: 'bar'},
   {id: 2, name: 'boo' },
   {id: 3, name: 'foo' }
]

コレクションを id で逆順にソートする必要があります。
実際には、ページをリロードしたときにのみ機能します。
新しいモデルを追加すると、新しいアイテムが明らかにランダムにリストに追加されます。
ページを更新すると、適切にソートされます。

私の質問は次のとおりです
。1) 新しいモデルを追加するときに問題を解決するにはどうすればよいですか?
2) コードを改善することは可能でしょうか?


これが私のコードです:

return Marionette.CompositeView.extend({

    initialize: function () {
        this.collection.fetch();
    },

    onRender: function () {
        var collection =  this.collection;

        collection.comparator = function (collection) {
            return - collection.get('id');
        }
    },

    onSuccess: function () {
        this.collection.add(this.messageModel);
        this.collection.sort(); // the messageModel seems to be added 
                                // apparently randomly to the list. 
                                // only if I refresh the page it will be ok
    }
})
4

3 に答える 3

14

Marionette >= 2.0の場合、デフォルトでソートCollectionViewを維持します。CompositeView

マリオネット< 2.0 および >= 1.3.0 の場合:

var MySortedView = Backbone.Marionette.CollectionView.extend({

  // ...

  appendHtml: function(collectionView, itemView, index) {
    // Already sorted when buffering.
    if (collectionView.isBuffering) {
      Backbone.Marionette.CollectionView.prototype.appendHtml.apply(this, arguments);
    }
    else {
      var childrenContainer = $(collectionView.childrenContainer || collectionView.el);
      var children = childrenContainer.children();
      if (children.size() === index) {
        childrenContainer.append(itemView.el);
      } else {
        childrenContainer.children().eq(index).before(itemView.el);
      } 
    }
  }

});

Marionette < 2.0 または < 1.3.0の場合(バッファリングなしの前と同じ):

var MySortedView = Backbone.Marionette.CollectionView.extend({

  // ...

  appendHtml: function(collectionView, itemView, index) {
    var childrenContainer = $(collectionView.childrenContainer || collectionView.el);
    var children = childrenContainer.children();
    if (children.size() === index) {
      childrenContainer.append(itemView.el);
    } else {
      childrenContainer.children().eq(index).before(itemView.el);
    } 
  }

});

CollectionView と CompositeView についても同様です。

于 2012-07-26T06:37:12.893 に答える
3

Marionette の連中はこれを Marionette に組み込むことを検討していると思いますが、それまでは、SortedCollectionViewという名前の小さな mixin を作成して、とCompositeViewクラスに混在させることができます。これは、 Gitterの本番環境で長い間頻繁に使用されており、非常にうまく機能することがわかっています。

于 2014-04-02T18:17:32.590 に答える
1

コレクションを作成するときに .comparator を宣言できますか? コードから、.comparator は onRender 関数内のローカル変数にのみ存在しvar collectionます。正しく定義されている場合、コレクションは自動的にソートされる必要があり、新しいモデルを追加した後に .sort を呼び出す必要はありません

var Chapters = new Backbone.Collection({
    comparator = function(chapter) {
        return chapter.get("id");
    };
});
于 2012-07-26T00:23:10.327 に答える