如何在SAPUI5中实施数据加载指标?

时间:2015-02-25 08:44:42

标签: javascript sapui5

我有一些缓慢的OData调用,需要向用户提供某种形式的视觉指示器。

我已阅读API并查看了attachRequestSent()等函数,以及setBusy(),BusyDialog和其他控件。

任何人都可以解释将此添加到实际代码的逻辑吗?如上所述,这样做有多种选择,那么应该在哪些情况下使用哪些?

编辑:我已经设置了异步批量读取OData调用。然后我将函数包装在处理函数中的接收数据中,并在批处理调用中的成功函数内调用该函数 这有效;视图加载,在填充数据字段之前,我看到一个忙碌的指示符。

见下面的代码。这是一个很好的方法吗,还是有更好的方法更标准?

oModel.submitBatch(
  function(){     
    successFn();
  }, ...   
);

successFn = function(){
  var oPersonalData = new sap.ui.model.json.JSONModel();
  ...
};

3 个答案:

答案 0 :(得分:4)

在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);

    },

答案 1 :(得分:0)

结帐此帖:SAPUI5 Wait for an Deferred-Object // wait for .done() function

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

答案 2 :(得分:0)

主要问题似乎是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)。