バックボーンjsのコレクションではset
属性を使用できませんが、コレクションに関するメタ情報を保存する必要があることがよくあります。その情報を設定するのに最適な場所はどこですか?
ただ .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");
specificメタデータを保存するためのより良い場所があるかもしれませんが、これはメタデータが何であるかに完全に依存します。
コレクションコンストラクターを拡張する汎用メタデータを格納するために、それを処理するメソッドが機能するはずです。
このメタデータを保存してサーバーからロードする必要がある場合、より大きなタスクが手元にあることに注意してください。
イベントのトリガーに関する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);
}
}
// ...
});