加载模块不起作用时设置繁忙状态

时间:2019-04-24 05:28:43

标签: javascript sapui5

我想点击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。我在做错什么吗?

2 个答案:

答案 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);
}