0

Установка атрибутов в коллекции - Backbone.js

30

Коллекции в Backbone.js не позволяют устанавливать атрибуты, однако я часто сталкиваюсь с необходимостью хранения мета-информации о коллекции. Какое наилучшее место для установки этой информации?

4 ответ(ов)

0

Наилучший способ использования Collection — это именно так, как он был задуман: как совокупность моделей. (Юлиен уже высказал эту мысль в комментарии к вопросу, и я хотел бы объяснить, почему я считаю его правым).

Представьте, что вы рассматриваете Библиотеку (коллекцию) Книг (модель), как в примерах из документации Backbone. Разумно, что у вас есть метаинформация о библиотеке, которую вы хотите сохранить, например, адрес, по которому она расположена.

Секрет в том, чтобы не рассматривать это как метаинформацию. У вас есть библиотека с множеством свойств, и одно из этих свойств — это ее коллекция книг.

var Book = Backbone.Model.extend({ 
    title: "Моби Дик"
});

var Collection = Backbone.Collection.extend({
    model: Book
});

var Library = {
    address: '45-я улица',
    collection: Collection
};

В этом примере я определил Библиотеку как простой объект JavaScript. Разумеется, вы также можете сделать Библиотеку моделью, чтобы она обладала всеми возможностями Backbone. Мой аргумент заключается в том, что вам нужно более реалистично представлять реальность, сделав шаг назад и осознав, что дополнительные свойства, которые вы хотите присвоить Collection, на самом деле являются свойствами-соседями объекта на уровень выше: в данном случае это Библиотека.

0

Ваша реализация с триггерами событий выглядит интересно и полезно! Давайте разберем, как этот код работает.

  1. Расширение коллекции: Вы определяете коллекцию cls.groups, которая расширяет Backbone.Collection. В конструкторе вы инициализируете объект _attributes, который будет хранить значения атрибутов.

  2. Метод attr: В этом методе вы добавляете функциональность для установки и получения атрибутов. Если значение не передано, возвращается текущее значение атрибута. Если значение передано, оно сохраняется в _attributes, и вызывается событие change:{prop}, которое позволит другим частям вашего приложения отреагировать на изменения.

  3. Модель cls.group: В вашей модели вы подписываетесь на событие change:selected в конструкторе. Это означает, что каждый раз, когда атрибут selected в коллекции изменяется, будет вызвана функция-обработчик, где вы можете выполнить необходимые действия.

  4. Обработка событий: В секции events вы определяете, что при клике на элемент вы вызываете метод attr и устанавливаете значение атрибута selected в cid текущей модели. Это позволит странице динамически реагировать на изменения в атрибутах коллекции.

В целом, ваш подход к обновлению атрибутов коллекции с триггером событий позволяет легко управлять состоянием и обеспечивать реактивность в вашем приложении. Если у вас есть дополнительные вопросы или нужны уточнения по какому-либо аспекту, не стесняйтесь спрашивать!

0

Ваше решение выглядит вполне приемлемым. Вы создали коллекцию Backbone, у которой есть методы put и get для работы с метаданными. Это позволяет вам добавлять и извлекать значения из объекта _meta, который служит для хранения свойств коллекции.

Вот краткое объяснение вашего кода:

  1. Вы расширяете Backbone.Collection, создавая MyCollection.
  2. В конструкторе initialize вы инициализируете объект _meta, который будет хранить свойства.
  3. Метод put добавляет новое свойство prop в объект _meta с переданным значением value.
  4. Метод get возвращает значение свойства prop из объекта _meta.

Пример использования наглядно демонстрирует, как вы можете добавлять и получать значения:

var collection = new MyCollection();
collection.put("someProperty", 12);
alert(collection.get("someProperty")); // выведет 12

Ваше решение действительно может помочь другим, у кого возникли схожие проблемы с использованием функции meta из решения @Raynos. Если у вас появились дополнительные вопросы или нужны пояснения — не стесняйтесь задавать их!

0

Я прочитал другие ответы и комментарии, и хотя я ценю идею о том, что обертывание коллекции в модель может быть безусловно самым чистым решением, я считаю это абсолютным переусердствованием в 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 });

Я пользуюсь этим уже много лет и никогда не сталкивался с проблемами или недостатками.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь