sapui5阻止视图渲染,直到加载模型

时间:2017-08-10 11:38:42

标签: javascript sapui5

我希望在调用onBeforeRendering方法之前在我的onInit方法中加载一个Model。 attachRequestCompleted的问题在于渲染后的某个时间。 例如,我在ProcessFlow中遇到此错误:

Render must not be called within Before or After Rendering Phase. Call ignored. -  [object Object]

所以我的问题是:给它一个阻止视图的函数,直到模型加载?

我在一个manifes.json和Component.js中的模型中实例化了我的视图。所以显示代码有点困难,但我加载我的模型:

 var oModel = new JSONModel().attachRequestCompleted(function(){...});
 var oConfigModel = new JSON().attachRequestCompleted(function(){
       oModel.loadData(oConfigModel.getURL());
 });
 oConfigModel.loadData("config.json");

我这样做是因为我依赖于我的主模型而形成并制作了一些模型。 目前我将数据放在ProcessFlow中,而不是数据绑定中的xml。

2 个答案:

答案 0 :(得分:0)

此处的选项可能是使用忙碌指示器。

init功能中启动指示符:

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

...并停止attachRequestCompleted回调函数中的指标:

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

更多信息here

答案 1 :(得分:0)

阻止UI永远不是一个好主意! ESP。按照评论中的建议进行同步请求是令人遗憾的。在主流浏览器的主线程上甚至不推荐使用同步请求。

您可以将视图设置为忙或甚至不可见,直到您的模型数据加载为止:

onInit: function() {
  var oView = this.getView();
  oView.setBusy(true);
  // option 2 set invisible: oView.setVisible(false);

  ... insert model init here ...
  var oModel = ...
  oModel.attachEventOnce("requestCompleted", function() {
    oView.setBusy(false);
    // option 2 set visible: oView.setVisible(true);
  });
}

请注意使用attachEventOnce代替attachRequestCompleted只会执行 - 猜猜 - 一次。

顺便说一句:为什么阻止或根本不显示用户界面如此重要?对于已经看到某人的用户来说,这是一种更好的体验。尽管最初视图可能是空的。

BR 克里斯