うーん。これがバックボーンに適した方法かどうかはわかりませんが、コレクション内のタグのリストを取得するロジックを配置します(これが「解析」の意味だと思います)。
メインビューとサブビューの両方が同じコレクションを「リッスン」し、サブビューはcollection.getTags()を呼び出すだけで、必要なタグのリストを取得します。
// Model that represents the list data
var ListDataModel = Backbone.Model.extend({
defaults: function() {
return {
name: null,
tags: []
};
}
});
// Collection of list data
var ListDataCollection = Backbone.Collection.extend({
model: ListDataModel,
initialize: function() {
var me = this;
// Expires tag collection on reset/change
this.on('reset', this.expireTagCache, this);
this.on('change', this.expireTagCache, this);
},
/**
* Expires tag cache
* @private
*/
expireTagCache: function() {
this._cachedTags = null;
},
/**
* Retrieves an array of tags in collection
*
* @return {Array}
*/
getTags: function() {
if (this._cachedTags === null) {
this._cachedTags = _.union.apply(this, this.pluck('tags'));
}
return this._cachedTags;
},
sync: function(method, model, options) {
if (method === 'read') {
var me = this;
// Make an XHR request to get data for this demo
Backbone.ajax({
url: '/echo/json/',
method: 'POST',
data: {
// Feed mock data into JSFiddle's mock XHR response
json: JSON.stringify([
{ id: 1, name: 'one', tags: [ 'number', 'first', 'odd' ] },
{ id: 2, name: 'two', tags: [ 'number', 'even' ] },
{ id: 3, name: 'a', tags: [ 'alphabet', 'first' ] }
]),
},
success: function(resp) {
options.success(me, resp, options);
},
error: function() {
if (options.error) {
options.error();
}
}
});
}
else {
// Call the default sync method for other sync method
Backbone.Collection.prototype.sync.apply(this, arguments);
}
}
});
var listColl = new ListDataCollection();
listColl.fetch({
success: function() {
console.log(listColl.getTags());
}
});
コレクションでこれを処理する理由は2つあると思います。
- これにより、Viewコードがよりクリーンに保たれます(これは、タグ抽出で非常に複雑なロジックを実行していないことを前提としています。これは、単純な_.pluck()と_.union()です。
- 関係するビジネスロジックは0です-おそらくデータレイヤーに属することができます。
パフォーマンスの問題に対処するには:
- コレクションは2回実行されます-ただし、この場合でも、消費しているデータの量が多すぎてクライアントが処理できない場合は、バックエンドにこのためのAPIエンドポイントを提供するように依頼することを検討してください。(合計1000個のタグを持つ500個のデータでさえ、最近のブラウザでは処理しきれないほど多くはありません。)
うーん。これは役に立ちますか?
JSFiddleは、コレクションとモデルでこれに対応します:http://jsfiddle.net/dashk/G8LaB/ (そして、の結果を示すログステートメント.getTags()
)。