SAP Fiori扩展控制器中重写嵌套属性的标准事件处理器问题
解决SAP Fiori控制器扩展中替换嵌套控制器事件处理器的问题
问题场景
已成功为SAP Fiori应用F2053创建扩展项目,扩展标准控制器Freestyle.js时,通过在自定义控制器FreestyleCustom.controller.js中创建同名函数重写onSubConditionChange事件,运行正常。但需要替换Fragment中绑定到.productGroupController.openValueHelpSearch的事件处理器时,在onInit中赋值自定义函数后,事件触发仍执行标准代码——调试显示赋值成功,但事件绑定早于onInit执行,导致替换无效。
解决方案
方案1:在onAfterRendering阶段替换目标函数
视图渲染完成后,事件绑定已完成,此时替换productGroupController的目标函数会生效。为避免onAfterRendering多次执行导致重复替换,可添加标记控制:
sap.ui.controller("customer.pmroffers.variant1.plugins.terms.styles.FreestyleCustom", { _isValueHelpOverridden: false, onAfterRendering: function() { if (!this._isValueHelpOverridden) { // 绑定自定义函数的上下文,确保this指向当前自定义控制器 this.productGroupController.openValueHelpSearch = this.onCustomerOpenValueHelpSearch.bind(this); this._isValueHelpOverridden = true; } }, onCustomerOpenValueHelpSearch: function(e) { // 自定义业务逻辑 console.log("触发自定义值帮助逻辑"); // 若需保留原标准逻辑,可调用原方法: // sap.ui.controller("sap.xxx.Freestyle").prototype.productGroupController.openValueHelpSearch.call(this.productGroupController, e); } });
方案2:直接重新绑定控件的事件
找到Fragment中的Input控件,移除原事件绑定并添加自定义事件处理器,绕过嵌套控制器的方法:
sap.ui.controller("customer.pmroffers.variant1.plugins.terms.styles.FreestyleCustom", { onAfterRendering: function() { // 替换为Fragment中Input控件的实际ID var oProductInput = this.getView().byId("productComboInput"); if (oProductInput) { // 移除原事件绑定 oProductInput.detachValueHelpRequest( this.productGroupController.openValueHelpSearch, this.productGroupController ); // 添加自定义事件绑定 oProductInput.attachValueHelpRequest( this.onCustomerOpenValueHelpSearch, this ); } }, onCustomerOpenValueHelpSearch: function(e) { // 自定义业务逻辑 } });
原因说明
Fragment中的事件绑定在视图初始化阶段完成,早于控制器onInit的执行时机,此时绑定的是原始productGroupController.openValueHelpSearch的函数引用。后续在onInit中替换函数对象,不会改变已绑定的引用关系。而onAfterRendering在视图渲染完成后执行,此时可以安全地替换函数或重新绑定事件。
内容的提问来源于stack exchange,提问作者Tudinho
相关产品推荐
相关产品推荐

