【发布时间】:2012-08-03 15:24:03
【问题描述】:
我正在尝试创建我的第一个主干应用程序,但在理解我应该如何使用视图时遇到了一些困难。
我想要做的是有一个搜索输入,每次提交它都会从服务器获取一个集合。我想让一个视图控制搜索输入区域并监听那里发生的事件(在我的示例中单击按钮)和另一个视图,其中包含用于显示搜索结果的子视图。每次新的搜索只是将结果添加到搜索区域中。
单个结果将有其他方法(例如查找输入的日期或时间等)。
我有一个这样定义的模型和集合:
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 元素,所以我不应该从另一个视图中实例化一个视图。任何建议表示赞赏,如果我需要更清楚地说明这一点,请告诉我,我会尽力改写问题。
【问题讨论】:
-
你看到任何 JS 错误被抛出了吗?此外,ajax 调用将在您的
SearchResultsCollection的初始化时进行,因为这是您告诉它进行获取的地方。 -
是的,它会登录到控制台,但不会发生 ajax 请求。也没有 js 错误。
-
请注意,在实际实现中,
ResultView实例将被创建,但它们的render结果不会添加到SearchView.$el。 -
代码是否到达
SearchResults.initialize()?你能在this.fetch()前面加一个console.log吗? -
我在这里看到一个错字
SearchResult = Backbone.model.extend({ ...
标签: backbone.js backbone-views