在集合js上设置属性

骨干js中的set不允许你set属性,但是我经常发现需要存储关于集合的一些元信息。 哪里是最好的地方来设置这些信息?

可能最好的方式是按照预期的方式使用Collection:作为一个模型包。 (朱利安已经在OP上评论这个,我想解释一下为什么我认为他是对的)

假设您正在考虑Book(模型)的库(集合),如同Backbone的文档示例。 这是有道理的,你已经有关于你想要存储的图书馆的元信息,如本书图书馆所在的地址。

诀窍是不要把它想成元信息。 你有一个有很多属性的图书馆,其中一个属性是它的书籍集合。

 var Book = Backbone.Model.extend({ title: "Moby Dick" }); var Collection = Backbone.Collection.extend({ model: Book }); var Library = { address: '45th Street', collection: Collection }; 

在这个例子中,我将Library定义为一个普通的JavaScript对象。 显然,你也可以使图书馆成为一个模型,使它具有所有的骨干钟声和口哨声。 我的观点是,你需要一个更现实的方式来expression现实,只需要退一步,看到你想要分配给集合的额外属性实际上是一个对象的同级属性:在这种情况下的图书馆。


只需使用元数据存储function.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"); 

存储特定元数据可能有更好的地方,但这完全取决于元数据是什么。

为了存储generics元数据扩展你的集合构造函数的方法来处理,应该工作。

要小心,如果这个元数据需要从服务器存储和加载,那么你手头上的任务就更大了。

我已经用事件触发提升了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); } } // ... }); 

仅使用一个参数使用@Raynos解决scheme的函数meta不适用于我。 所以我用了下面的代码:

 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")); 

希望它会有所帮助。