骨干中是否有任何类型的钩子我可以很容易地说"每当任何一个集合正在获取数据时,显示微调器,在它们完成时隐藏它"?
我觉得它会比这更复杂,需要覆盖特定的功能。我什么时候应该展示微调器?在fetch()
或refresh()
或其他内容?
答案 0 :(得分:36)
您可以使用jQuery ajaxStart和ajaxStop。这些将在发出ajax请求时全局运行,因此获取和保存将导致它们运行。添加代码以在开头显示微调器并最终隐藏它。
答案 1 :(得分:25)
在Backbone.js 1.0.0中,您可以使用request
和sync
个事件http://backbonejs.org/#Events-catalog
这在视图中。
initialize: function(){
this.items = new APP.Collections.itemCollection();
this.items.bind('request', this.ajaxStart, this);
this.items.bind('sync', this.ajaxComplete, this);
}
ajaxStart: function(arg1,arg2,arg3){
//start spinner
$('#item-loading').fadeIn({duration:100});
},
ajaxComplete: function(){
$('#item-loading').fadeOut({duration:100});
}
这可以应用于每个集合或每个模型这里是一些CSS用于微调器http://abandon.ie/notebook/simple-loading-spinner-for-backbonejs
答案 2 :(得分:11)
Backbone不会在Collection::fetch()
启动时触发任何事件(see source code),因此您必须覆盖fetch
方法。也许是这样的:
var oldCollectionFetch = Backbone.Collection.prototype.fetch;
Backbone.Collection.prototype.fetch = function(options) {
this.trigger("fetch:started");
oldCollectionFetch.call(this, options);
}
这将覆盖fetch
方法,以便在提取开始时为您提供事件。但是,这只会触发特定集合实例上的事件,因此如果您有一堆不同的集合,则必须在每个集合上监听该事件。
答案 3 :(得分:8)
我在没有覆盖主干的情况下这样做的方式是:
在视图中
var myView = Backbone.View.extend({
initialize; function(){
this.$el.addClass('loading');
collection.fetch(success:function(){
this.$el.removeClass('loading')
})
}
})
另一条路线是在添加模型时删除加载类,通常你有:
var myView = Backbone.View.extend({
initialize; function(){
_.bindAll(this, 'addAll')
collection.bind('reset', this.addAll)
this.$el.addClass('loading');
collection.fetch();
},
addAll: function(){
this.$el.removeClass('loading');
collection.each(this.addOne);
}
})
在大多数情况下,这些几乎是相同的,因为加载器真的是为了用户体验,在显示内容之前删除它是有意义的。
答案 4 :(得分:3)
稍微更新一下。自2012年12月13日以来,已向Backbone.sync添加了"request"
事件,该事件会在开始向服务器发出请求时触发。自2012年1月30日起,还添加了"sync"
事件,只要模型的状态与服务器成功同步(创建,保存,销毁),就会触发该事件。
因此,您不需要覆盖或扩展本机Backbone的方法。对于收听“开始/结束提取”事件,您可以将侦听器添加到您的模型/集合中,例如:
var view = new Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, 'request', this.yourCallback); //start fetching
this.listenTo(this.model, 'sync', this.yourCallback); //finish fetching
}
});
答案 5 :(得分:1)
您可以在任何模型上创建一个名为sync
的方法,backbone.js会调用它来进行同步。或者您只需替换方法Backbone.sync.
这样您就可以在源代码中的一个位置进行更改。
答案 6 :(得分:1)
我在我的骨干网中使用了NProgress,它是那里最好的装载机/旋转器。
var view = Backbone.View.extend({
initialize: function () {
this.items = new APP.Collections.itemCollection();
this.items.on('reset', this.myAddFunction, this);
NProgress.start();
collection.fetch({
reset:true,
success: function () {
NProgress.done(true);
}
});
}
});
答案 7 :(得分:0)
使用Backbone同步方法, 它会每次调用主干同步方法,不仅可以获取,保存,更新和删除
除了直接ajax * / 之外,每次请求都会听到同步应用程序的骑行Backbone._sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
// Clone the all options
var params = _.clone(options);
params.success = function(model) {
// Write code to hide the loading symbol
//$("#loading").hide();
if (options.success)
options.success(model);
};
params.failure = function(model) {
// Write code to hide the loading symbol
//$("#loading").hide();
if (options.failure)
options.failure(model);
};
params.error = function(xhr, errText) {
// Write code to hide the loading symbol
//$("#loading").hide();
if (options.error)
options.error(xhr, errText);
};
// Write code to show the loading symbol
//$("#loading").show();
Backbone._sync(method, model, params);
};