Сохранение и загрузка метаданных в коллекции backbone.js
У меня есть ситуация с использованием backbone.js, где у меня есть коллекция моделей и дополнительная информация о моделях. Например, представьте, что я возвращаю список сумм: у них есть количество, связанное с каждой моделью. Предположим теперь, что единица для каждой из сумм всегда одна и та же: скажем, кварты. Тогда объект json, который я верну с моей службы, может выглядеть примерно так:
{
dataPoints: [
{quantity: 5 },
{quantity: 10 },
...
],
unit : quarts
}
Теперь у базовых коллекций нет реального механизма для естественного связывания этих метаданных с коллекцией, но мне было предложено в этом вопросе: Установка атрибутов в коллекции - магистраль js, что я могу расширить коллекцию с помощью функции стиля .meta(property, [value])
- это отличное решение. Однако, естественно, мы должны иметь возможность чисто извлекать эти данные из json-ответа, подобного тому, который был у нас выше.
Backbone.js дает нам функцию parse(response)
, которая позволяет нам указать, где извлечь список коллекций моделей из комбинации с атрибутом url
. Тем не менее, я не знаю, как сделать более интеллектуальную функцию без перегрузки fetch()
, которая удалит частичную функциональность, которая уже доступна.
Мой вопрос заключается в следующем: есть ли лучший вариант, чем перегрузка fetch()
(и попытка его назвать реализацией суперкласса) для достижения того, чего я хочу достичь?
Спасибо
Ответы
Ответ 1
Лично я обернул Collection
внутри другого Model
, а затем переопределит parse
, например:
var DataPointsCollection = Backbone.Collection.extend({ /* etc etc */ });
var CollectionContainer = Backbone.Model.extend({
defaults: {
dataPoints: new DataPointsCollection(),
unit: "quarts"
},
parse: function(obj) {
// update the inner collection
this.get("dataPoints").refresh(obj.dataPoints);
// this mightn't be necessary
delete obj.dataPoints;
return obj;
}
});
Вызов Collection.refresh()
обновляет модель новыми значениями. Передача пользовательского значения meta
в Сборку, как было предложено ранее, может помешать вам связать эти метазначения.
Ответ 2
Эти метаданные не относятся к коллекции. Он принадлежит имени или другому дескриптору кода. Ваш код должен декларативно знать, что его коллекция заполнена только кварцевыми элементами. Это уже происходит, поскольку url указывает на элементы кварца.
var quartzCollection = new FooCollection();
quartzCollection.url = quartzurl;
quartzCollection.fetch();
Если вам действительно нужны эти данные, почему бы вам просто не позвонить
_.uniq(quartzCollecion.pluck("unit"))[0];