我正在尝试创建我的第一个主干应用程序,并且遇到了一些困难,难以理解我的意图是如何使用视图。引用一个集合的多个主干视图
我想要做的是有一个搜索输入,每次提交它从服务器提取一个集合。我希望有一个视图控制搜索输入区域,并监听发生在那里的事件(在我的示例中点击一个按钮)以及另一个视图,其中包含用于显示搜索结果的子视图。每次新的搜索都只是将搜索结果添加到搜索区域。
个人的结果将有其他方法(如查找他们在哪里输入等日期或时间)。
我有这样定义的模型和集合:
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