本文介绍了是否在另一个事件之后覆盖事件参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
视图中:
<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的模块,这意味着事件必须实现init
和reset
,然后其相应的ObjectPool实例(内部)将利用这两个实例来重用现有事件实例用于下一个事件。
"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" 👍 */
},
});
},
这篇关于是否在另一个事件之后覆盖事件参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!