Сохранение и загрузка метаданных в коллекцию backbone.js - PullRequest
14 голосов
/ 09 мая 2011

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

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

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

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

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

Спасибо

Ответы [ 2 ]

22 голосов
/ 09 мая 2011

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

0 голосов
/ 09 мая 2011

Эти метаданные не относятся к коллекции. Он принадлежит имени или некоторому другому дескриптору кода. Ваш код должен декларативно знать, что в его коллекции только кварцевые элементы. Это уже происходит, поскольку URL указывает на кварцевые элементы.

var quartzCollection = new FooCollection();
quartzCollection.url = quartzurl;
quartzCollection.fetch();

Если вам действительно нужно получить эти данные, почему бы вам просто не позвонить

_.uniq(quartzCollecion.pluck("unit"))[0];

...