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



коллекции в backbone js не позволяют вам set атрибуты, но я часто нахожу, что есть необходимость хранить некоторую метаинформацию о коллекции. Где лучше всего установить эту информацию?

628   4  

4 ответов:

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

предположим, вы думаете о библиотеке (коллекции) книги (модели), как в примерах документации Backbone. Это имеет смысл, что у вас есть мета-информация о библиотеке, которую вы хотите сохранить, например, адрес, где эта библиотека находится.

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

var Book = Backbone.Model.extend({ 
    title: "Moby Dick"
});

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

var Library = {
    address: '45th Street',
    collection: Collection
};

в этом примере я определил библиотеку как простой объект JavaScript. Очевидно, вы также можете сделать библиотеку моделью, так что у нее есть все основные колокола и свистки. Я хочу сказать, что вам нужно представить реальность более реалистично, сделав один шаг назад и увидев, что дополнительные свойства, которые вы хотите для присвоения коллекции фактически являются одноуровневыми свойствами объекта на один уровень выше: библиотека в этом случае.


просто .extend коллекция с функцией хранения метаданных.

var MyCollection = Backbone.Collection.extend({
    initialize: function() {
        ...

        this._meta = {};
    },
    model: ...
    meta: function(prop, value) {
        if (value === undefined) {
            return this._meta[prop]
        } else {
            this._meta[prop] = value;
        }
    },
});

var collection = new MyCollection();
collection.add(someModels);
collection.meta("someProperty", value);

...

var value = collection.meta("someProperty");

могут быть лучшие места для хранения конкретные метаданные, но это полностью зависит от того, что такое метаданные.

для хранения общих метаданных расширение конструктора коллекции с помощью метода, чтобы сделать дело с этим должно работать.

будьте осторожны, что если эти метаданные должны быть сохранены и загружены с сервера, то у вас есть больше задача под рукой.

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

cls.groups = Backbone.Collection.extend({

    // ...

    // Reference to this collection's model.
    model: cls.group,

    initialize: function() {
        this._attributes = {}
    },

    // Extend collection with ability to store attributes and trigger events on attributes changing
    attr: function(prop, value) {
        if (value === undefined) {
            return this._attributes[prop]
        } else {
            this._attributes[prop] = value;
            this.trigger('change:' + prop, value);
        }
    },

    // ...

});


cls.group = Backbone.View.extend({

    // ...

    initialize: function() {

        // Catching attribute update
        app.groups.on('change:selected', function(value) {
            // ...
        }, this);
    },

    // ...

    events: {
        'click' : function(e) {
            // Set collection meta attribute on model's view click event
            app.groups.attr('selected', this.model.cid);
        }
    }

    // ...

});

С помощью функции meta из @Raynos решение только с одним параметром не работает для меня. Поэтому я использовал следующий код:

var MyCollection = Backbone.Collection.extend({
    initialize: function() {
        this._meta = {};
    },
    put: function(prop, value) {
        this._meta[prop] = value;
    },
    get: function(prop) {
        return this._meta[prop];
    }
});

var collection = new MyCollection();
collection.put("someProperty", 12);
alert(collection.get("someProperty"));

надеюсь, что это помогает.

Comments

    Ничего не найдено.