backbone js中的集合不允许set
属性,但我经常发现需要存储一些关于集合的元信息。设置该信息的最佳位置在哪里?
发布于 2014-09-19 15:09:47
最好是完全按照预期的方式使用Collection :作为模型的捆绑包。(Julien已经在OP上评论了这一点,我想解释一下为什么我认为他是对的)
假设您正在考虑Backbone的文档示例中的Library (集合) of Book (模型)。这是有意义的,你已经获得了关于你想要存储的图书馆的元信息,比如这本书图书馆所在的地址。
诀窍是不要把它看作是元信息。你有一个有很多属性的图书馆,其中一个属性就是它的藏书。
var Book = Backbone.Model.extend({
title: "Moby Dick"
});
var Collection = Backbone.Collection.extend({
model: Book
});
var Library = {
address: '45th Street',
collection: Collection
};
在本例中,我将库定义为一个普通的JavaScript对象。显然,你也可以让Library成为一个模型,这样它就拥有了所有的主干功能。我在这里的观点是,您需要以一种更现实的方式来表示现实,退后一步,并看到您想要分配给Collection的额外属性实际上是上一级对象的兄弟属性:在本例中是Library。
发布于 2011-05-09 06:34:21
只需使用元数据存储功能.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");
可能有更好的地方来存储特定的元数据,但这完全取决于元数据是什么。
为了存储泛型元数据,用一个方法来扩展你的集合构造函数,这应该是可行的。
请注意,如果需要从服务器存储和加载这些元数据,那么您手头就有一个更大的任务。
发布于 2012-05-13 02:55:20
我升级了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);
}
}
// ...
});
https://stackoverflow.com/questions/5930656
复制相似问题