我正在尝试创建我的第一个主干应用程序,并且在理解我应该如何使用视图时遇到了一些困难。
我想要做的是有一个搜索输入,每次提交它都会从服务器获取一个集合。我想让一个视图控制搜索输入区域并监听那里发生的事件(在我的示例中单击按钮)和另一个视图,其中包含用于显示搜索结果的子视图。每次新搜索都只是将结果添加到搜索区域中。
个别结果将有其他方法(例如查找他们输入的日期或时间等)。
我有一个这样定义的模型和集合:
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');
通过 ResultSetView 集合的初始化方法对服务器进行任何 ajax 调用。
我设计这个是正确的还是有更好的方法来做到这一点。我认为因为这两个视图绑定到不同的 dom 元素,所以我不应该从另一个视图中实例化一个视图。任何建议表示赞赏,如果我需要更清楚地说明这一点,请告诉我,我会尽力改写这个问题。