我想点击sap.m.Button
来加载第三方模块。由于库需要花费一些时间来加载,因此我想显示繁忙的视图。但这是行不通的。我要加载第三方模块,并在加载并执行该模块的功能之后,要将视图繁忙设置为false
。
控制器:
onPressDownload: function () {
var view = this.getView();
view.setBusy(true);
jQuery.sap.require('pdfmake.build.pdfmake');
jQuery.sap.require('pdfmake.build.vfs_fonts');
if (pdfMake) {
var docDef = "";
pdfMake.createPdf(docDef).download();
view.setBusy(false);
}
},
查看:
var oBtn = new sap.m.Button({
press: [oController.onPressDownload, oController]
});
当jQuery.sap.require
进行同步调用时,view.setBusy
应该可以工作。但是它无法正常工作,view.setBusy()
立即重置为false
。我在做错什么吗?
答案 0 :(得分:0)
所有控件(包括视图)均向busyIndicatorDelay
提供默认值1000
ms。即如果等待时间短于1秒,则该应用将始终不会显示忙碌指示器。 Fiori设计指南建议的延迟时间为一秒钟。 src 您可以将其减少到0
ms。但是,不能解决实际问题,原因之一是:..:
当
jQuery.sap.require
进行同步调用时,view.setBusy
应该可以工作。
不幸的是,这是另一回事。 因为,它会进行同步调用,因此无法处理预期的繁忙状态,因为同步请求会完全冻结浏览器的主线程/事件循环。即:
control.setBusy(true);
// <synchronous calls>;
control.setBusy(false);
与相同
control.setBusy(true);
control.setBusy(false);
请停止使用已弃用的jQuery.sap.require
函数,并用sap.ui.require
替换它,或将依赖项添加到顶部的sap.ui.define
。
onPressDownload: function() {
this.getView().setBusy(true);
sap.ui.require([ // Instead of jQuery.sap.require("...")
"pdfmake/build/pdfmake",
"pdfmake/build/vfs_fonts",
], function(/*...*/) {
// ...
this.getView().setBusy(false);
}.bind(this));
},
请参见https://stackoverflow.com/a/45277948/5846045
API sap.ui.require
可用于按需异步获取模块/ JS文件。
⚠️请确保在引导时启用 index.html 中的模块异步加载:
// since 1.58.2
data-sap-ui-libs="sap.ui.core, sap.m, ..."
data-sap-ui-async="true" // replaces preload="async" and xx-async="true"
// for 1.58.1 and below
data-sap-ui-libs="sap.ui.core, sap.m, ..."
data-sap-ui-preload="async"
data-sap-ui-xx-async="true"
如果缺少这些设置,JS文件仍将同步加载!
答案 1 :(得分:-1)
这对我有用
onPressDownload: function () {
var view = this.getView();
view.setBusyIndicatorDelay(0);
view.setBusy(true);
setTimeout(function(){
jQuery.sap.require('pdfmake.build.pdfmake');
jQuery.sap.require('pdfmake.build.vfs_fonts');
if (pdfMake) {
var docDef = "";
pdfMake.createPdf(docDef).download();
view.setBusy(false);
}
}, 0);
}