Backbone.js предоставляет гибкий механизм для организации данных и представлений через модели, коллекции и представления. Группировка элементов — важная концепция, позволяющая управлять набором связанных данных и их визуальным отображением.
Модель (Backbone.Model) — это единичный
объект данных с методами для управления состоянием, валидации и
синхронизации с сервером. Каждая модель имеет уникальный идентификатор
id и может содержать произвольные атрибуты.
Коллекция (Backbone.Collection)
представляет собой набор моделей одного типа. Коллекция
обеспечивает:
Пример создания коллекции и добавления моделей:
var Task = Backbone.Model.extend({
defaults: {
title: '',
completed: false
}
});
var TaskList = Backbone.Collection.extend({
model: Task
});
var tasks = new TaskList();
tasks.add({title: 'Выучить Backbone.js'});
tasks.add({title: 'Создать приложение'});
Коллекция автоматически отслеживает изменения в моделях и может реагировать на события через слушатели:
tasks.on('add', function(model) {
console.log('Добавлена задача:', model.get('title'));
});
Для структурирования данных внутри коллекции часто используется группировка по ключу. Backbone.js не имеет встроенной функции для группировки, но она легко реализуется с помощью стандартных методов коллекций:
var groupedTasks = tasks.groupBy(function(task) {
return task.get('completed') ? 'completed' : 'pending';
});
console.log(groupedTasks);
// { pending: [Task], completed: [] }
groupBy возвращает объект, где ключи — значения, по
которым производится группировка, а значения — массивы моделей.Представление (Backbone.View) отвечает
за отображение модели или коллекции в DOM. Для работы с группировкой
часто создаются вложенные представления:
ParentView отображает контейнер для группы
элементов.ChildView отвечает за отдельную модель или
подгруппу.Пример структуры:
var TaskView = Backbone.View.extend({
tagName: 'li',
render: function() {
this.$el.text(this.model.get('title'));
return this;
}
});
var TaskGroupView = Backbone.View.extend({
tagName: 'ul',
initialize: function(options) {
this.collection = options.collection;
this.listenTo(this.collection, 'add remove change', this.render);
},
render: function() {
this.$el.empty();
var grouped = this.collection.groupBy(function(task) {
return task.get('completed') ? 'completed' : 'pending';
});
for (var key in grouped) {
var groupEl = $('<li>').text(key);
var subList = $('<ul>');
grouped[key].forEach(function(task) {
var view = new TaskView({model: task});
subList.append(view.render().el);
});
groupEl.append(subList);
this.$el.append(groupEl);
}
return this;
}
});
var groupView = new TaskGroupView({collection: tasks});
$('body').append(groupView.render().el);
Ключевые моменты:
listenTo) позволяют автоматически обновлять
представление при изменении коллекции.ul > li > ul) упрощают
визуальное разделение групп.Для группировки элементов часто применяются фильтры и сортировка коллекций:
var completedTasks = tasks.filter(function(task) {
return task.get('completed');
});
var sortedTasks = tasks.sortBy('title');
filter возвращает массив моделей, соответствующих
условию.sortBy создает новый массив моделей, отсортированных по
атрибуту.Чтобы группы оставались актуальными при изменении атрибутов, важно отслеживать события моделей:
tasks.each(function(task) {
task.on('change:completed', function() {
groupView.render();
});
});
change:attribute позволяет обновлять только
нужную часть представления.Группировка элементов в Backbone.js сочетает мощь коллекций и представлений. Она обеспечивает структуру данных, упрощает фильтрацию и визуальное отображение, позволяя создавать интерфейсы с динамическими списками, категориями и подгруппами.