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