Javascript 加载模型之前的sapui5块视图渲染

Javascript 加载模型之前的sapui5块视图渲染,javascript,sapui5,Javascript,Sapui5,我想在调用onBeforeRendering方法之前,在我的onInit方法中加载一个模型。 attachRequestCompleted的问题是,它在渲染后调用。 例如,我在ProcessFlow中遇到以下错误: Render must not be called within Before or After Rendering Phase. Call ignored. - [object Object] 所以我的问题是:给它一个函数,在模型加载之前阻止视图 我在manifes.json上

我想在调用onBeforeRendering方法之前,在我的onInit方法中加载一个模型。 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");
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);
  });
}
我这样做是因为我在主模型的依赖关系中格式化和制作一些模型。
目前,我将数据放在xml数据绑定的ProcessFlow中。

这里的一个选项是使用忙碌指示器

init
函数中启动指示器:

sap.ui.core.BusyIndicator.show();
sap.ui.core.BusyIndicator.hide();
…并停止
attachRequestCompleted
回调函数中的指示器:

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

更多信息。

阻止用户界面从来都不是一个好主意!特别是,按照评论中的建议执行同步请求是令人敬畏的。在主流浏览器中,同步请求甚至在主线程上被弃用

在加载模型数据之前,可以将视图设置为繁忙甚至不可见,如下所示:

 var oModel = new JSONModel().attachRequestCompleted(function(){...});
 var oConfigModel = new JSON().attachRequestCompleted(function(){
       oModel.loadData(oConfigModel.getURL());
 });
 oConfigModel.loadData("config.json");
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);
  });
}
请注意,使用的是
attacheventon
而不是
attachRequestCompleted
,它只会执行-猜猜是什么-一次

顺便问一下:为什么阻止或根本不显示UI如此重要?即使一个视图最初可能是空的,但对于用户来说,已经看到某个内容是一种更好的体验


Chris

你能让模型请求同步吗?请给我们看一些代码(问题中)你是如何引导的,尤其是如何定义和实例化视图和控制器。我已经编辑了这个问题。我尝试使用BusyIndicator,但它不起作用。如果需要先获取数据,然后使用它来确定视图的哪些部分可见,哪些部分不可见,该怎么办?在异步情况下,用户可能会更快地加载视图并查看所有部分,但一旦数据加载,部分将被隐藏,我认为这对用户来说是不好的体验。