В Backbone.js коллекции (Backbone.Collection)
представляют собой упорядоченные наборы моделей. Основной мощью
коллекций является возможность отслеживания изменений в
моделях и управления набором данных, что достигается через
систему событий. События коллекций позволяют реагировать на добавление,
удаление, изменение и сортировку моделей, обеспечивая динамическое
обновление интерфейса и логики приложения.
Коллекции в Backbone.js поддерживают следующие ключевые события:
add Срабатывает при добавлении
модели в коллекцию.
var books = new Backbone.Collection();
books.on('add', function(model) {
console.log('Добавлена модель:', model.get('title'));
});
books.add({ title: 'JavaScript для профессионалов' });
В обработчик передается добавленная модель.
remove Срабатывает при удалении
модели из коллекции.
books.on('remove', function(model) {
console.log('Удалена модель:', model.get('title'));
});
books.remove(books.at(0));
Позволяет реагировать на удаление элементов и обновлять представления.
reset Вызывается при массовой
замене содержимого коллекции через метод reset.
books.on('reset', function(collection) {
console.log('Коллекция была сброшена. Новые данные:', collection.models);
});
books.reset([{ title: 'Backbone.js в действии' }]);
В отличие от add и remove, событие
reset срабатывает один раз для всей коллекции.
sort Срабатывает при сортировке
коллекции методом sort.
books.on('sort', function() {
console.log('Коллекция отсортирована.');
});
books.comparator = 'title';
books.sort();
Позволяет автоматически обновлять представления после сортировки.
update Срабатывает после завершения
добавления, удаления или сброса моделей в коллекции, объединяя события
add, remove и reset.
books.on('UPDATE', function(collection, options) {
console.log('Коллекция обновлена', options);
});
books.add([{ title: 'Node.js для всех' }]);
books.remove(books.at(0));Каждая коллекция отслеживает события своих моделей. Например,
изменение атрибутов модели вызывает событие change
коллекции:
books.on('change:title', function(model) {
console.log('Изменен заголовок книги:', model.get('title'));
});
var book = books.at(0);
book.se t('title', 'Современный Backbone.js');
Важно: коллекция автоматически подписывается на события всех добавленных моделей, что позволяет централизованно отслеживать изменения данных.
Backbone поддерживает подписку на несколько событий одновременно, что повышает гибкость:
books.on('add remove reset', function(modelOrCollection, options) {
console.log('Коллекция изменилась:', modelOrCollection, options);
});
Такой подход полезен для создания универсальных обработчиков изменений коллекции без дублирования кода.
Методы коллекции поддерживают опции для управления поведением событий:
silent — предотвращает срабатывание
событий:books.add({ title: 'Silent Model' }, { silent: true });
at — вставка модели в конкретную
позицию:books.add({ title: 'Вставка в начало' }, { at: 0 });
merge и remove —
используются при массовом обновлении коллекции для контроля объединения
и удаления моделей.Использование событий коллекций обеспечивает реактивное
обновление интерфейса. Часто в Backbone.js представление
(View) подписывается на события коллекции:
var BooksView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'add remove reset change', this.render);
},
render: function() {
this.$el.empty();
this.collection.each(function(book) {
this.$el.append('<li>' + book.get('title') + '</li>');
}, this);
}
});
var view = new BooksView({ collection: books });
Такой подход позволяет хранить данные и отображение отдельно, обеспечивая чистую архитектуру приложения.
add, remove,
reset для отслеживания изменений данных.update для объединения нескольких изменений в
одну реакцию.silent для операций, где реакция на
событие не требуется.listenTo вместо
on для корректного управления жизненным циклом обработчиков
и предотвращения утечек памяти.События коллекций Backbone.js создают гибкий механизм синхронизации данных и интерфейса, позволяя строить масштабируемые и динамичные приложения на основе JavaScript.