我有一些缓慢的OData调用,需要向用户提供某种形式的视觉指示器。
我已阅读API并查看了attachRequestSent()等函数,以及setBusy(),BusyDialog和其他控件。
任何人都可以解释将此添加到实际代码的逻辑吗?如上所述,这样做有多种选择,那么应该在哪些情况下使用哪些?
编辑:我已经设置了异步批量读取OData调用。然后我将函数包装在处理函数中的接收数据中,并在批处理调用中的成功函数内调用该函数 这有效;视图加载,在填充数据字段之前,我看到一个忙碌的指示符。
见下面的代码。这是一个很好的方法吗,还是有更好的方法更标准?
oModel.submitBatch(
function(){
successFn();
}, ...
);
successFn = function(){
var oPersonalData = new sap.ui.model.json.JSONModel();
...
};
答案 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)。