"setInitialFocusId" _oDialog.destroy() 之后的错误

"setInitialFocusId" error after _oDialog.destroy()

我在调用 this._oDialog.destroy() 后再次尝试打开对话框片段时出现以下错误:

Uncaught TypeError: Cannot read property 'setInitialFocusId' of null

我的问题就像此处所述的问题: 但是,解决方案显然似乎只是 "Don't use the property setInitialFocus",我没有在我的代码中的任何地方使用它。

控制器

openDialog: function() {
  if (!this._oDialog) {
    this._oDialog = sap.ui.xmlfragment("myFragmentPath", this);
    this.getView().addDependent(this._oDialog);
  }
  this._oDialog.open();
},

onExit: function () {
  if (this._oDialog) {
    this._oDialog.destroy();
  }
},

afterClose: function () {
  if (this._oDialog) {
    this._oDialog.destroy();
  }
},

handleClose: function (oEvent) {
  this._oDialog.close();
}

对话框片段

<Dialog xmlns="sap.m" afterClose=".afterClose">
  <!-- ... -->
</Dialog>

主要XML视图

<Button press=".openDialog" />

附加信息:

if (this._oDialog) {
  this._oDialog.destroy();
  this._oDialog = null; // make it falsy so that it can be created next time
}

关闭后,对话框将在您的代码中销毁。 但是, this._oDialog 仍然存在。

由于 this._oDialog 不是一个虚假值,而只是一个 destroyed 对话框实例,因此 openDialog() 第二次没有创建新的对话框。因此,您正试图打开一个已损坏的对话框。

当对话框被销毁时,其内部oPopupset to null,这解释了错误信息。


⚠️注意

  1. 关闭后通常不需要销毁对话框。当视图被销毁时,对话框将自动销毁,因为片段依赖于视图。如果打算重置数据值,请尝试 而不是每次都销毁并重新创建整个片段,这非常昂贵。

  2. 自 UI5 1.56 起,工厂函数 sap.ui.xmlfragment 已弃用 因为它通过同步 XHR(阻塞主线程)获取片段。使用 .

    之一
  3. 一个更简单的选择是 在您的视图定义中 <core:Fragment fragmentName="..." type="XML" /> 以声明方式添加片段 到特定的 <dependents> 聚合控制。 Like in this sample.