我正在嘗試創建我的第一個主幹應用程序,並且遇到了一些困難,難以理解我的意圖是如何使用視圖。引用一個集合的多個主幹視圖
我想要做的是有一個搜索輸入,每次提交它從服務器提取一個集合。我希望有一個視圖控制搜索輸入區域,並監聽發生在那裏的事件(在我的示例中點擊一個按鈕)以及另一個視圖,其中包含用於顯示搜索結果的子視圖。每次新的搜索都只是將搜索結果添加到搜索區域。
個人的結果將有其他方法(如查找他們在哪裏輸入等日期或時間)。
我有這樣定義的模型和集合:
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()
}
});
在我的意見我已表示搜索輸入一個觀點是:
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');
但沒有Ajax調用MA從ResultSetView集合的初始化方法到服務器。
我在設計這個權利還是有更好的方法來做到這一點。我認爲,因爲這兩個視圖綁定到不同的DOM元素,我不應該從另一個視圖中實例化一個視圖。任何建議表示讚賞,如果我需要說明這個更清楚,請讓我知道,我會盡我所能來重述這個問題。
你是否看到任何JS錯誤被拋出? 此外,ajax調用將在您的'SearchResults''Collection'的初始化過程中進行,因爲這是您告訴它執行抓取的位置。 – bvulaj 2012-08-03 15:28:58
是的,它會登錄到控制檯,但不會發生ajax請求。也沒有js錯誤。 – justinfay 2012-08-03 15:36:30
請注意,在實際的實現中,'ResultView'實例將被創建,但它們的'render'結果將不會被添加到'SearchView。$ el'中。 – fguillen 2012-08-03 15:36:39