异步加载片段时如何使用`oEvent`?

How to use `oEvent` when loading fragment asynchronously?

我可以在使用此代码时使用 oEvent

onPressDialog: function(oEvent) {
    if (!this._oDialog) {
        this._oDialog= sap.ui.xmlfragment("idDialog", "com.Dialog", this);
        this.getView().addDependent(this._oDialog);
    }
    this._oDialog.setBindingContext(oEvent.getSource().getParent().getBindingContext());
    this._oDialog.open();
},

但是,我尝试使用 Fragment.load 更改它,但无法从函数中获取 oEvent。有什么想法吗?

onPressDialog: function(oEvent) {
    if (!this._oDialog) {
        Fragment.load({ // Fragment required from "sap/ui/core/Fragment"
            id: this.getView().getId(),
            name: "com.Dialog",
            controller: this
        }).then(function(oDialog) {
            this.getView().addDependent(oDialog);
            oDialog.setBindingContext(/*Can't access the right oEvent values here*/);
            oDialog.open();
        }.bind(this));
    }
},

如上面 中所述,oEvent 参数在事件处理程序 (onPressDialog) 执行后完全重置。 IE。异步获取片段后,oEvent 对象将不再包含相同的引用/参数值。在创建片段之前尝试将目标引用存储在闭包变量中,然后在最终解决承诺时使用该变量。

给定片段定义中的<Dialog id="myDialog">

从 UI5 1.93 开始

使用API oController.loadFragment

onPressDialog: async function(oEvent) {
  const myEventValue = oEvent.get/*...*/; // to use later without relying on oEvent
  const oDialog = this.byId("myDialog") || await this.loadFragment({ name: "com.Dialog" });
  // ... Do something with myEventValue ...
  oDialog.open();
},

自 UI5 1.58

使用API Fragment.load

onPressDialog: async function(oEvent) {
  const myEventValue = oEvent.get/*...*/; // to use later without relying on oEvent
  let oDialog = this.byId("myDialog");
  if (!oDialog) {
    oDialog = await Fragment.load({ // Fragment required from "sap/ui/core/Fragment"
      id: this.getView().getId(),
      name: "com.Dialog",
      controller: this,
    });
    this.getView().addDependent(oDialog);
  }
  // ... Do something with myEventValue ...
  oDialog.open();
},