You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:51:00