初めてのバックボーン アプリを作成しようとしていますが、ビューの使用方法を理解するのに苦労しています。
私がやろうとしているのは、送信されるたびにサーバーからコレクションを取得する検索入力を用意することです。1 つのビューで検索入力領域を制御し、そこで発生するイベント (この例ではボタンのクリック) をリッスンし、別のビューで検索結果を表示するサブビューを作成したいと考えています。新しい検索ごとに、結果を検索領域の前に追加するだけです。
個々の結果には、他の方法があります (入力された日付や時刻の検索など)。
次のように定義されたモデルとコレクションがあります。
SearchResult = Backbone.model.extend({
defaults: {
title: null,
text: null
}
});
SearchResults = Backbone.Collection.extend({
model: SearchResult,
initialize: function(query){
this.query = query;
this.fetch();
},
url: function() {
return '/search/' + this.query()
}
});
私のビューでは、検索入力を表すビューが 1 つあります。
var SearchView = Backbone.View.extend({
el: $('#search'),
events: {
'click button': 'doSearch'
},
doSearch: function() {
console.log('starting new search');
var resultSet = new SearchResults($('input[type=text]', this.el).val());
var resultSetView = new ResultView(resultSet);
}
});
var searchView = new SearchView();
var ResultSetView = Backbone.View.extend({
el: $('#search'),
initialize: function(resultSet) {
this.collection = resultSet;
this.render();
},
render: function() {
_(this.collection.models).each(function(result) {
var resultView = new ResultView({model:result});
}, this);
}
});
var ResultView = Backbone.view.extend({
tagName: 'div',
model: SearchResult,
initialize: function() {
this.render();
},
render: function(){
$(this.el).append(this.model.get(title) + '<br>' + this.model.get('text'));
}
});
私のhtmlはおおよそ次のようになります。
<body>
<div id="search">
<input type="text">
<button>submit</button>
</div>
<div id="results">
</div>
</body>
私のコードではconsole.log('starting new search');
、ResultSetView コレクションの初期化メソッドからサーバーへの ajax 呼び出しは行われません。
私はこれを正しく設計していますか、それともこれを行うためのより良い方法がありますか? 2 つのビューは異なる dom 要素にバインドされるため、あるビューを別のビューからインスタンス化するべきではないと思います。アドバイスをいただければ幸いです。これをより明確に述べる必要がある場合はお知らせください。質問を言い換えるために最善を尽くします。