バックボーン アプリケーションのいくつかの場所で、コレクションをすばやく検索したいと考えていますが、それを実装する最善の方法を見つけるのに苦労しています。
これが簡単な実装です。http://jsfiddle.net/7YgeE/私のコレクションには 200 以上のモデルが含まれている可能性があることに注意してください。
var CollectionView = Backbone.View.extend({
template: $('#template').html(),
initialize: function() {
this.collection = new Backbone.Collection([
{ first: 'John', last: 'Doe' },
{ first: 'Mary', last: 'Jane' },
{ first: 'Billy', last: 'Bob' },
{ first: 'Dexter', last: 'Morgan' },
{ first: 'Walter', last: 'White' },
{ first: 'Billy', last: 'Bobby' }
]);
this.collection.on('add', this.addOne, this);
this.render();
},
events: {
'keyup .search': 'search',
},
// Returns array subset of models that match search.
search: function(e) {
var search = this.$('.search').val().toLowerCase();
this.$('tbody').empty(); // is this creating ghost views?
_.each(this.collection.filter(function(model) {
return _.some(
model.values(),
function(value) {
return ~value.toLowerCase().indexOf(search);
});
}), $.proxy(this.addOne, this));
},
addOne: function(model) {
var view = new RowView({ model: model });
this.$('tbody').append(view.render().el);
},
render: function() {
$('#insert').replaceWith(this.$el.html(this.template));
this.collection.each(this.addOne, this);
}
});
そして、各モデルの小さなビュー...
var RowView = Backbone.View.extend({
tagName: 'tr',
events: {
'click': 'click'
},
click: function () {
// Set element to active
this.$el.addClass('selected').siblings().removeClass('selected');
// Some detail view will listen for this.
App.trigger('model:view', this.model);
},
render: function() {
this.$el.html('<td>' + this.model.get('first') + '</td><td>' + this.model.get('last') + '</td>');
return this;
}
});
new CollectionView;
質問1
キーを押すたびに、コレクションをフィルタリングし、 を空にしtbody
、結果をレンダリングして、すべてのモデルの新しいビューを作成します。ゴースト ビューを作成しました。各ビューを適切に破棄するのが最善でしょうか? それとも、自分RowView
の s を管理しようとする必要があります... それぞれを 1 回だけ作成し、それらをループして結果のみをレンダリングする必要がありますか? CollectionView
おそらく私の配列?を空にした後tbody
、 はRowViews
まだそれらを持っていますか、el
それとも今は null であり、再レンダリングする必要がありますか?
質問 2、モデルの選択
でカスタム イベントをトリガーしていることに気付くでしょうRowView
。そのイベントを処理し、モデル全体を表示する詳細ビューをどこかに置きたいと思います。リストを検索したときに、選択したモデルが検索結果に残っている場合は、その状態を維持して詳細ビューに残しておきたいです。結果に表示されなくなったら、詳細ビューを空にします。ビューの配列を管理する必要がありますよね?各ビューがそのモデルを指し、各モデルがそのビューを指す二重にリンクされた構造を検討しました...しかし、将来モデルにシングルトンファクトリを実装する場合、それをモデル。:/
では、これらのビューを管理する最善の方法は何でしょうか?