我正在使用backbone.js构建一个应用。在该应用中,我有一个主视图,它呈现一个包含两个子视图的模板。其中之一是标题视图,另一个视图则包含某些内容。标题视图只用于与内容视图交互,并具有特定功能。
在标题模板和内容模板中,我都有相同的代码段,即一个隐藏的DIV和一个加载器图像。当发生ajax调用时,将显示加载器。问题在于,当我首次加载应用程序(或者在刷新内容视图时),内容视图正在从ajax请求中加载一些数据,但是加载器在标题和内容模板中都出现了(就好像ajaxStart()是全局事件而不是附加到视图上的事件)。
以下是内容视图的设置:
但出于某些未定义的原因,
我认为
为了确定这种行为,我已经注释掉了内容视图中的
我不知道我做错了什么 :(
编辑(回答“mu is too short”后):
我的内容视图现在看起来像这样:
但是加载器仍然显示在页眉视图模板中。
PS:
在标题模板和内容模板中,我都有相同的代码段,即一个隐藏的DIV和一个加载器图像。当发生ajax调用时,将显示加载器。问题在于,当我首次加载应用程序(或者在刷新内容视图时),内容视图正在从ajax请求中加载一些数据,但是加载器在标题和内容模板中都出现了(就好像ajaxStart()是全局事件而不是附加到视图上的事件)。
以下是内容视图的设置:
App.View.Content = Backbone.View.extend({
type:'test',
template: twig({
href: '/js/app/Template/Content.html.twig',
async: false
}),
block:{
test:twig({
href: '/js/app/Template/block/test.html.twig',
async: false
})
},
list:[],
showLoader: function(el){
console.log('loader: ', $('#ajax_loader', el));
$('#ajax_loader', el).show();
console.log('Ajax request started...');
},
hideLoader: function(el){
$('#ajax_loader', el).hide();
console.log('Ajax request ended...');
},
initialize: function(params)
{
this.el = params.el;
this.type = params.type || this.type;
var self = this;
this.el
.ajaxStart(function(){self.showLoader(self.el);})
.ajaxStop(function(){self.hideLoader(self.el);});
this.render(function(){
self.list = new App.Collection.ListCollection();
self.refresh(1, 10);
});
},
refresh:function(page, limit)
{
var self = this;
console.log('Refreshing...');
$('#id-list-content').fadeOut('fast', function(){
$(this).html('');
});
this.list.type = this.type;
this.list.page = page || 1;
this.list.limit = limit || 10;
this.list.fetch({
success: function(data){
//console.log(data.toJSON());
$.each(data.toJSON(), function(){
//console.log(this.type);
var tpl_block = self.block[this.type];
if (tpl_block != undefined) {
var block = tpl_block.render({
test: this
});
$(block).appendTo('#id-list-content');
}
});
$('#id-list-content').fadeIn('fast');
}
});
},
render: function(callback)
{
console.log('Rendering list...');
this.el.html(this.template.render({
}));
if (undefined != callback) {
callback();
}
}
});
你可以看到,我正在使用一段丑陋的代码来绑定ajaxStart / ajaxStop事件:
this.el
.ajaxStart(function(){self.showLoader(self.el);})
.ajaxStop(function(){self.hideLoader(self.el);});
我以前是这样的:
this.el
.ajaxStart(self.showLoader())
.ajaxStop(self.hideLoader());
但出于某些未定义的原因,
this.el
在showLoader()
和hideLoader()
中没有被定义。我认为
ajaxStart()
和ajaxStop()
是附加在this.el
DOM上的,只有这个视图才能监听它。但是我的headerView具有完全相同的设置(加载的twig模板除外),显然也接收到了事件并显示了加载程序。为了确定这种行为,我已经注释掉了内容视图中的
showLoader()
,但加载程序仍然会显示在头部视图中。我不知道我做错了什么 :(
编辑(回答“mu is too short”后):
我的内容视图现在看起来像这样:
showLoader: function(){
//this.$('#ajax_loader').show();
console.log('Ajax request started...');
},
hideLoader: function(){
this.$('#ajax_loader').hide();
console.log('Ajax request ended...');
},
initialize: function(params)
{
var self = this;
console.log(this.el);
_.bindAll(this, 'showLoader', 'hideLoader');
this.$el
.ajaxStart(this.showLoader)
.ajaxStop(this.hideLoader);
this.render(function(){
self.list = new App.Collection.List();
self.refresh(1, 10);
});
},
...
render: function(callback)
{
console.log('Rendering post by page...');
this.$el.html(this.template.render({
}));
if (undefined != callback) {
callback();
}
}
并且我的头部视图:
...
showLoader: function(){
this.$('#ajax_loader').show();
//console.log('Ajax request started...');
},
hideLoader: function(el){
this.$('#ajax_loader').hide();
console.log('Ajax request ended...');
},
initialize: function(params)
{
var self = this;
_.bindAll(this, 'showLoader', 'hideLoader');
this.$el
.ajaxStart(this.showLoader)
.ajaxStop(this.hideLoader);
this.models.Link = new App.Model.Link();
this.render();
},
render: function(callback)
{
this.$el.html(this.template.render({
data: []
}));
if (undefined != callback) {
callback();
}
}
...
但是加载器仍然显示在页眉视图模板中。
PS:
this.showLoader()
不是错别字,因为我想在当前的backbone视图内调用该函数。
$(x).ajaxStart()
这个函数是个骗局,因为它的实际意义是$(anything_at_all).ajaxStart()
。你必须通过在$.ajax
参数中绑定指定的AJAX调用或者返回的jqXHR
对象中进行绑定。 - mu is too shortfetch
方法有成功和错误回调,你可能可以使用它们。如果你想添加某种“开始获取”事件,也可以提供自己的sync
和fetch
方法。通常在执行fetch
之前会显示加载器,当fetch
完成获取后,加载器会在render
被调用时消失。 - mu is too shortajaxStart()
和ajaxStop()
的适当解决方案。 - maxwell2022