本文介绍了是否在另一个事件之后覆盖事件参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

视图中:

<List selectionChange=".onSelectionChange">

在控制器中:

onSelectionChange: function (oEvent) {
  console.log(oEvent.sId); // log 1, output "selectionChange"
  MessageBox.warning(Utils.i18n("CHANGE_CONFIRM"), {
    actions: [ Utils.i18n("LEAVE_BTN"), MessageBox.Action.CANCEL ],
    onClose: function (sAction) {
      console.log(oEvent.sId); // log 2, output "closed"
      if (sAction === Utils.i18n("LEAVE_BTN")) {
        this._showDetail(oEvent.getParameter("listItem") || oEvent.getSource(), oEvent.getSource().data("target"));
      }
    }.bind(this)
  });
}
您好,请问触发onClose时,oEvent为什么会发生变化?为什么我无法将oEvent存储在我的作用域中?

推荐答案

Event是实现Poolable的模块,这意味着事件必须实现initreset,然后其相应的ObjectPool实例(内部)将利用这两个实例来重用现有事件实例用于下一个事件。

在我们的示例中,";next event";是由对话框触发的"close"事件。正如您已经注意到的,oEvent突然没有ID"selectionChange",而是"close"。这是因为事件实例已重置并再次使用。由于oEvent只是一个引用(不是副本),并且由于JS应用Call by Object-Sharing,因此它是";Changed";。

ObjectPool的API参考说明了它如何处理事件实例:

目前认为(oEvent)对象"no longer needed" when its handler is called。因此,该对象已在onSelectionChange之后立即重置,并在onClose被触发之前再次初始化。

UI5这样做是为了不必创建和销毁多个事件实例来提高性能。这是从Object Pool Design Pattern(也是often used in game development)借用的做法。


那么,这对我们作为应用程序开发人员意味着什么呢?只是不要依赖闭包内部的事件对象。取而代之的是,将对象中的原始值分配给单独的变量,以便我们以后可以使用它们。例如:

onSelectionChange: function(oEvent) {
  const eventId = oEvent.getId(); // === "selectionChange"
  MessageBox.warning(/*...*/, {
    onClose: function() {
      /* oEvent.getId() === suddenly "close" but
         eventId === still "selectionChange" 👍 */
    },
  });
},

这篇关于是否在另一个事件之后覆盖事件参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-12 04:13