Установка атрибутов в коллекции - Backbone.js
Коллекции в Backbone.js не позволяют устанавливать атрибуты, однако я часто сталкиваюсь с необходимостью хранения мета-информации о коллекции. Какое наилучшее место для установки этой информации?
4 ответ(ов)
Наилучший способ использования Collection — это именно так, как он был задуман: как совокупность моделей. (Юлиен уже высказал эту мысль в комментарии к вопросу, и я хотел бы объяснить, почему я считаю его правым).
Представьте, что вы рассматриваете Библиотеку (коллекцию) Книг (модель), как в примерах из документации Backbone. Разумно, что у вас есть метаинформация о библиотеке, которую вы хотите сохранить, например, адрес, по которому она расположена.
Секрет в том, чтобы не рассматривать это как метаинформацию. У вас есть библиотека с множеством свойств, и одно из этих свойств — это ее коллекция книг.
var Book = Backbone.Model.extend({
title: "Моби Дик"
});
var Collection = Backbone.Collection.extend({
model: Book
});
var Library = {
address: '45-я улица',
collection: Collection
};
В этом примере я определил Библиотеку как простой объект JavaScript. Разумеется, вы также можете сделать Библиотеку моделью, чтобы она обладала всеми возможностями Backbone. Мой аргумент заключается в том, что вам нужно более реалистично представлять реальность, сделав шаг назад и осознав, что дополнительные свойства, которые вы хотите присвоить Collection, на самом деле являются свойствами-соседями объекта на уровень выше: в данном случае это Библиотека.
Ваша реализация с триггерами событий выглядит интересно и полезно! Давайте разберем, как этот код работает.
Расширение коллекции: Вы определяете коллекцию
cls.groups
, которая расширяетBackbone.Collection
. В конструкторе вы инициализируете объект_attributes
, который будет хранить значения атрибутов.Метод
attr
: В этом методе вы добавляете функциональность для установки и получения атрибутов. Если значение не передано, возвращается текущее значение атрибута. Если значение передано, оно сохраняется в_attributes
, и вызывается событиеchange:{prop}
, которое позволит другим частям вашего приложения отреагировать на изменения.Модель
cls.group
: В вашей модели вы подписываетесь на событиеchange:selected
в конструкторе. Это означает, что каждый раз, когда атрибутselected
в коллекции изменяется, будет вызвана функция-обработчик, где вы можете выполнить необходимые действия.Обработка событий: В секции
events
вы определяете, что при клике на элемент вы вызываете методattr
и устанавливаете значение атрибутаselected
вcid
текущей модели. Это позволит странице динамически реагировать на изменения в атрибутах коллекции.
В целом, ваш подход к обновлению атрибутов коллекции с триггером событий позволяет легко управлять состоянием и обеспечивать реактивность в вашем приложении. Если у вас есть дополнительные вопросы или нужны уточнения по какому-либо аспекту, не стесняйтесь спрашивать!
Ваше решение выглядит вполне приемлемым. Вы создали коллекцию Backbone, у которой есть методы put
и get
для работы с метаданными. Это позволяет вам добавлять и извлекать значения из объекта _meta
, который служит для хранения свойств коллекции.
Вот краткое объяснение вашего кода:
- Вы расширяете
Backbone.Collection
, создаваяMyCollection
. - В конструкторе
initialize
вы инициализируете объект_meta
, который будет хранить свойства. - Метод
put
добавляет новое свойствоprop
в объект_meta
с переданным значениемvalue
. - Метод
get
возвращает значение свойстваprop
из объекта_meta
.
Пример использования наглядно демонстрирует, как вы можете добавлять и получать значения:
var collection = new MyCollection();
collection.put("someProperty", 12);
alert(collection.get("someProperty")); // выведет 12
Ваше решение действительно может помочь другим, у кого возникли схожие проблемы с использованием функции meta
из решения @Raynos. Если у вас появились дополнительные вопросы или нужны пояснения — не стесняйтесь задавать их!
Я прочитал другие ответы и комментарии, и хотя я ценю идею о том, что обертывание коллекции в модель может быть безусловно самым чистым решением, я считаю это абсолютным переусердствованием в 99.9% случаев. Backbone предоставляет хуки initialize
именно для этой цели.
const FooCollection = Backbone.Collection.extend({
initialize: function(models, attributes) {
attributes.log && console.log('foo!'); // Или можно установить атрибуты на 'this' и т.д.
}
});
// Передаем null для первого аргумента, который является массивом моделей
// для инициализации коллекции
const fooCollection = new FooCollection(null, { log: true });
Я пользуюсь этим уже много лет и никогда не сталкивался с проблемами или недостатками.
Как преобразовать Set в Array?
Где найти документацию по форматированию даты в JavaScript?
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как определить нажатие клавиши Esc?
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"