【问题标题】:Why are busy indicators not displayed when sending requests?为什么发送请求时不显示忙指示符?
【发布时间】:2015-02-25 08:44:42
【问题描述】:

我有一些缓慢的 OData 调用,需要向用户提供某种视觉指示,表明正在发生某些事情。

我阅读了 API 参考并看到了 attachRequestSent()setBusy()BusyDialogBusyIndicator 等函数。

我尝试相应地使用它们,但对我不起作用。问题似乎是oModel.create 导致整个应用程序在执行时挂起。在create 函数返回之前,应用程序被冻结,因此无法运行任何加载指示器或任何东西。


编辑:我设置了一个异步批量读取 OData 调用。然后,我将用于处理接收到的数据的代码包装在一个函数中,并在批处理调用的成功函数中调用该函数。
这行得通;视图加载,我在字段填充数据之前看到一个繁忙的指示器

oModel.submitBatch(/*fnSuccess*/);

这是一个好方法吗,还是有更好的更标准的方法?

【问题讨论】:

标签: javascript sapui5


【解决方案1】:

在调用 Odata 之前,显示忙碌指示符(锁定整个应用屏幕)。与

sap.ui.core.BusyIndicator.show(0);

然后,在 odata 调用的成功和失败处理程序中,将其隐藏

sap.ui.core.BusyIndicator.hide();

它不适用于隐式调用(例如,当您绑定到 odata 模型时),为此您可以使用请求发送事件,但想法是相同的。

编辑:您还需要稍稍延迟以使指标出现,然后在稍稍延迟后使用 setTimeout 调用您的 odata。

doStuffWithIndicator: function(){
        sap.ui.core.BusyIndicator.show(0);
        setTimeout(function(){
            doStuff();
            sap.ui.core.BusyIndicator.hide();
        }, 20);

    },

【讨论】:

  • 我试过这个,但它对我不起作用。主要问题似乎是 oModel.create 导致整个应用程序在执行时挂起。由于应用程序在创建函数返回之前被冻结,因此无法运行任何加载指示器或任何东西。
【解决方案2】:

签出这个帖子:SAPUI5 Wait for an Deferred-Object // wait for .done() function

Javascript 是异步的,这意味着无论您是否拨打电话(可能需要更长时间),都会进一步处理代码。因此,在调用 OData 服务之前,您需要通过延迟对象告诉您的 JS 等待它(使其同步)。

【讨论】:

    【解决方案3】:

    主要问题似乎是oModel.create 导致整个应用程序在执行时挂起。由于应用程序在create 函数返回之前被冻结,因此无法运行任何加载指示器或任何内容。

    听起来您一直在使用现已弃用的 sap.ui.model.odata.ODataModel,它主要发送同步 XHR。同步 XHR 会阻塞主线程(== UI 线程),直到浏览器收到响应。浏览器无法在往返期间更新 DOM 以显示忙碌指示符。

    如果有人阅读本文有同样的问题,请migrate to the newer equivalent model: sap/ui/model/odata/v2/ODataModel。它只发送异步请求 (AJAX),允许 UI 线程在浏览器等待响应时处理其他任务(例如向 DOM 添加忙碌指示符)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2014-10-04
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      相关资源
      最近更新 更多