OData异步回调中无法识别事件参数oEvent的getSource方法问题
问题根因
报错是因为UI5的事件对象oEvent在异步回调执行时已经被框架回收、重置属性:你发起OData异步请求之后,success回调触发的时间点远晚于事件函数执行完毕的时间,此时再调用oEvent.getSource()已经拿不到原始触发事件的输入控件实例,调用setValue方法自然会报错。
解决方法
在发起异步请求之前,提前把触发事件的源控件实例存储到局部变量里,后续所有操作都直接引用这个提前存好的控件实例即可。
修改后的完整代码
validateEquipment: function (oEvent) { var _this = this; // 提前存储事件源控件,避免异步回调时oEvent失效 var oInputControl = oEvent.getSource(); var circ7 = _this._oComponent.getModel("LoggedInUser").getData().circ7; var equipmentNumber = oInputControl.getValue(); var equipmentType = "1"; if (oEvent.getParameter("id").indexOf("containerID") > -1) { equipmentType = "2"; } var module = ""; if (circ7 && equipmentNumber.length === 10) { _this._oComponent.getModel("serviceMetaData").read("Equipment_Look(EquipmentType='" + equipmentType + "',EquipmentNumber='" + equipmentNumber + "',Module='" + module + "',Circ7='" + circ7 + "')", { success: function (data) { if (data && data.ErrorMessage === "") { // 原有校验通过逻辑保留 } else if (data) { // 直接用提前存好的控件实例操作 oInputControl.setValue(''); MessageBox.error(data.ErrorMessage); } }, // 原有错误回调等逻辑保留 }) } else { oInputControl.setValue(""); MessageBox.error("Equipment " + equipmentNumber + " is invalid."); } }
补充说明:不仅是OData请求回调,所有异步场景(比如定时器、接口调用、Promise回调等)需要操作事件源控件的,都建议提前存储控件实例,不要在异步回调里再去从
oEvent上取源。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

