このトピックに関するスレッドがhttps://github.com/marionettejs/backbone.marionette/issues/78にあります。
@breischlが指摘したように、Backboneはコンパレータを定義するとコレクションをソートしたままにしますが、順序が変更されたときにMarionetteはCollectionViewを自動的に再レンダリングしません。実際、Marionette はadd
コレクションのイベントをリッスンし、新しい ItemViewを追加します。
CollectionView
アイテムを常に新しい順に表示し、追加された新しいアイテムをappendedではなく先頭に追加する場合は、次のようにappendHtml
メソッドをオーバーライドします。CollectionView
var MyCollectionView = Backbone.Marionette.CollectionView.extend({
appendHtml: function(collectionView, itemView){
collectionView.$el.prepend(itemView.el);
}
});
コメントで@diraが言及したように特定の場所に挿入できるようにしたい場合は、sberrymanによるgithubの上記のリンクに投稿された解決策があり、便宜上ここで再現します(免責事項:以下のコードはテストしていません個人的に):
appendHtml を次のように変更します。
appendHtml: function(collectionView, itemView) {
var itemIndex;
itemIndex = collectionView.collection.indexOf(itemView.model);
return collectionView.$el.insertAt(itemIndex, itemView.$el);
}
そして、以下を追加して拡張し、機能jQuery
を提供します。insertAt
(function($) {
return jQuery.fn.insertAt = function(index, element) {
var lastIndex;
if (index <= 0) return this.prepend(element);
lastIndex = this.children().size();
if (index >= lastIndex) return this.append(element);
return $(this.children()[index - 1]).after(element);
};
})(jQuery);