Javascript 主干模型保存阻塞UI
我要做的是在保存主干模型之前显示一条“保存”消息(使用jQuery的slideDown()),并在从服务器收到响应后隐藏它(jQuery slideUp())。然而,出于某种原因,即使调试一切似乎都正常工作,jquery slideDown直到从服务器收到响应后才会触发。这是我的密码:Javascript 主干模型保存阻塞UI,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我要做的是在保存主干模型之前显示一条“保存”消息(使用jQuery的slideDown()),并在从服务器收到响应后隐藏它(jQuery slideUp())。然而,出于某种原因,即使调试一切似乎都正常工作,jquery slideDown直到从服务器收到响应后才会触发。这是我的密码: saveSystemConfiguration: function (result) { /// <summary> /// Saves the system c
saveSystemConfiguration: function (result) {
/// <summary>
/// Saves the system configuration.
/// </summary>
/// <returns type="Object">The promise.</returns>
var self = this;
Global.eventAggregator.trigger('loading:start', $('#savingPopupMsg').text());
var promise = this.model.save({}, {
success: function (model) {
model.set('isNew', false);
self.dirty = false;
result.success = true;
Global.eventAggregator.trigger('loading:end', $('#savingPopupMsg').text());
self.isSaving = false;
},
error: function (model, error) {
self.isSaving = false;
result.success = false;
Global.eventAggregator.trigger('loading:end', $('#savingPopupMsg').text());
self.displayError();
},
async: false
});
return promise;
}
saveSystemConfiguration:函数(结果){
///
///保存系统配置。
///
///承诺。
var self=这个;
Global.eventAggregator.trigger('loading:start',$('savingPopupMsg').text();
var promise=this.model.save({}{
成功:功能(模型){
model.set('isNew',false);
self.dirty=false;
result.success=true;
Global.eventAggregator.trigger('loading:end',$('savingPopupMsg').text();
self.isSaving=false;
},
错误:函数(模型,错误){
self.isSaving=false;
result.success=false;
Global.eventAggregator.trigger('loading:end',$('savingPopupMsg').text();
self.displayError();
},
异步:false
});
回报承诺;
}
loading:start和loading:end事件由loadingView处理,后者触发slideDown()和slideUp()
var loadingView=Backbone.View.extend({
el:$(“#加载PopupView”),
初始化:函数(){
///
///在事件聚合器上设置侦听器。
///
_.bindAll(这是“showView”、“hideView”);
Global.eventAggregator.on('load:start',this.showView);
Global.eventAggregator.on('load:end',this.hideView);
this.minDisplayTime=1000;
},
showView:功能(msg){
///显示加载视图。
///加载时要显示的消息。
这是$(“#加载原因”).text(msg);
这个.$el.slideDown('fast');
this.mindisplaytimereach=new$.Deferred();
var self=这个;
setTimeout(函数(){
self.mindisplaytimeated.resolve();
},这是minDisplayTime);
},
hideView:函数(){
///隐藏加载视图。
var self=这个;
如果(!this.mindisplaytimered){
返回;
}
this.mindisplaytimerarch.done(函数(){
self.$el.slideUp('fast');
});
}
});
返回加载视图;
});
非常感谢您的帮助。主干网将其HTTP请求委托给jQuery,您将显式地传递给请求: 异步(默认值:true)
默认情况下,所有请求都是异步发送的(即,默认情况下设置为true)。如果你需要 同步请求,将此选项设置为false 删除非阻塞呼叫的此选项
var loadingView = Backbone.View.extend({
el: $('#loadingPopupView'),
initialize: function () {
/// <summary>
/// Sets up listeners on the event aggregator.
/// </summary>
_.bindAll(this, 'showView', 'hideView');
Global.eventAggregator.on('loading:start', this.showView);
Global.eventAggregator.on('loading:end', this.hideView);
this.minDisplayTime = 1000;
},
showView: function (msg) {
/// <summary>Shows the loading view.</summary>
/// <param name="msg" type="Object">The message to display while loading.</param>
this.$('#loadingReason').text(msg);
this.$el.slideDown('fast');
this.minDisplayTimeReached = new $.Deferred();
var self = this;
setTimeout(function () {
self.minDisplayTimeReached.resolve();
}, this.minDisplayTime);
},
hideView: function () {
/// <summary>Hides the loading view.</summary>
var self = this;
if (!this.minDisplayTimeReached) {
return;
}
this.minDisplayTimeReached.done(function() {
self.$el.slideUp('fast');
});
}
});
return loadingView;
});