Подтвердить что ты не робот

Сохранение и загрузка метаданных в коллекции backbone.js

У меня есть ситуация с использованием backbone.js, где у меня есть коллекция моделей и дополнительная информация о моделях. Например, представьте, что я возвращаю список сумм: у них есть количество, связанное с каждой моделью. Предположим теперь, что единица для каждой из сумм всегда одна и та же: скажем, кварты. Тогда объект json, который я верну с моей службы, может выглядеть примерно так:

{
    dataPoints: [
         {quantity: 5 },
         {quantity: 10 },
         ...
    ],
    unit : quarts
 }

Теперь у базовых коллекций нет реального механизма для естественного связывания этих метаданных с коллекцией, но мне было предложено в этом вопросе: Установка атрибутов в коллекции - магистраль js, что я могу расширить коллекцию с помощью функции стиля .meta(property, [value]) - это отличное решение. Однако, естественно, мы должны иметь возможность чисто извлекать эти данные из json-ответа, подобного тому, который был у нас выше.

Backbone.js дает нам функцию parse(response), которая позволяет нам указать, где извлечь список коллекций моделей из комбинации с атрибутом url. Тем не менее, я не знаю, как сделать более интеллектуальную функцию без перегрузки fetch(), которая удалит частичную функциональность, которая уже доступна.

Мой вопрос заключается в следующем: есть ли лучший вариант, чем перегрузка fetch() (и попытка его назвать реализацией суперкласса) для достижения того, чего я хочу достичь?

Спасибо

4b9b3361

Ответ 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];