Я пытаюсь найти способ эффективно отображать отсортированную Marionette.CollectionView, отсортированную по нескольким атрибутам без изменения базовой коллекции Backbone. Для этого примера я использую «имя» и «онлайн» атрибуты, и хочу, чтобы мой CollectionView будет отображаться в 2-х частей:Эффективная коллекция Marionette CollectionView для нескольких атрибутов
- онлайн, по алфавиту
- офлайновых, по алфавиту
У меня есть одну коллекцию Backbone.Models и хотите использовать ее в моем веб-приложении. Поэтому наличие функции сортировки в моей коллекции мне не подходит.
Мой пример кода выглядит следующим образом:
var MyCollection = Backbone.Collection.extend({
model:Backbone.Model
});
var myCollection = new MyCollection();
myCollection.set([
{ name : 'Freddy', online : true },
{ name : 'Zorro', online : false },
{ name : 'Charlie', online : false },
{ name : 'Alice', online : true }
]);
var MyView = ...
/*
omitted for brevity, though my template is like
<li>{{name}} {{#if online}}(Online){{/if}}</li>
*/
var MyCollectionView = Marionette.Collection.extend({
childView:MyView,
viewComparator: function (item1, item2) {
var item1Online = item1.get('online');
var item2Online = item2.get('online');
if (item1Online != item2Online)
return item1Online ? -1 : 1;
var item1Name = item1.get('name');
var item2Name = item2.get('name');
return item1Name.localeCompare(item2Name);
}
});
var myCollectionView = new MyCollectionView({collection:myCollection});
appView.getRegion('example').show(myCollectionView);
Я хотел бы, чтобы это будет отображаться как:
- Алиса (онлайн)
- Freddy (Online)
- Чарли
- Zorro
Это прекрасно, когда все данные добавляются в коллекцию сразу или добавляют/удаляют события, но если один из атрибутов обновлен в модели, которая уже находится в коллекции, представление не обновляется.
Если свойство «онлайн» Чарли изменилось на истину - например, выполнив.
charlieModel.set('online', true)
Я хотел бы CollectionView, что вынесенное автоматически:
- Алиса (онлайн)
- Чарли (Интернет)
- Freddy (Интернет)
- Зорро
Любые предложения? Спасибо заранее.
Я всегда задавался вопросом, что лучший способ сделать это в Backbone, но 1) страх не имея метод сортировки, это не так. 2) в сочетании с методом .clone(), вы можете свободно сортировать копию коллекции, не изменяя ее источник. – stolli