В этой теме есть тема на https://github.com/marionettejs/backbone.marionette/issues/78
Хотя Backbone сохраняет коллекцию отсортированной после определения компаратора, как указывал @breischl, Marionette не выполняет повторную визуализацию CollectionView при изменении порядка,Фактически, Marionette прослушивает событие add
в коллекции и добавляет новый ItemView.
Если вы хотите, чтобы ваш CollectionView
всегда отображал элементы в обратном хронологическом порядке, и выхотите, чтобы новые элементы были добавлены с добавлением вместо с добавлением , а затем переопределите метод appendHtml
в вашем CollectionView
следующим образом:
var MyCollectionView = Backbone.Marionette.CollectionView.extend({
appendHtml: function(collectionView, itemView){
collectionView.$el.prepend(itemView.el);
}
});
Если вы хотитечтобы иметь возможность вставлять в определенном месте, как @dira, упомянутое в комментарии, есть решение, размещенное по ссылке выше на github sberryman, которое я воспроизвожу здесь для удобства (отказ от ответственности: я не тестировал код ниже лично):
Измените 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);