在SAP WebIDE适配项目中扩展Fiori标准应用控制器方法遇阻
问题:SAP WebIDE适配项目中无法访问标准Fiori应用的ext/controller路径
我们正通过SAP WebIDE的适配项目扩展标准Fiori应用,尝试重写ext/controller/SourceOfSupplyList.controller.js中的函数,但无法在控制器扩展文件中访问该控制器。代码中可正常访问utils路径及其中文件,却无法访问ext/controller路径。
相关代码
sap.ui.define([ 'sap/ui/core/mvc/ControllerExtension', 'sap/ui/core/mvc/OverrideExecution', 'ui/s2p/mm/sspreq/manages1/utils/formatter' ], function ( ControllerExtension, OverrideExecution, formatter ) { "use strict"; return ControllerExtension.extend("customer.zTest.SourceOfSupplyListExtension", { metadata: { // extension can declare the public methods // in general methods that start with "_" are private methods: { publicMethod: { public: true /*default*/ , final: false /*default*/ , overrideExecution: OverrideExecution.Instead /*default*/ }, } }, override: { onInit: function () { alert("onInitOverride"); const originalPrototype = Object.assign({}, formatter); formatter.supplierFieldControl = function (oEvent) { // we could overwrite the function in the formatter just fine console.log("supplierFieldControlExtension"); // you can still call the original method too originalPrototype.supplierFieldControl.apply(this, arguments); }; console.log(ui/s2p/mm/sspreq/manages1/ext/controller/SourceOfSupplyList); //unable to access ext/controller debugger; } } }); });
原应用文件夹结构

解决方法
1. 正确引入目标控制器模块
UI5中访问控制器需要通过模块路径引入,且必须加上.controller后缀。修改sap.ui.define的依赖数组,添加目标控制器的路径:
sap.ui.define([ 'sap/ui/core/mvc/ControllerExtension', 'sap/ui/core/mvc/OverrideExecution', 'ui/s2p/mm/sspreq/manages1/utils/formatter', 'ui/s2p/mm/sspreq/manages1/ext/controller/SourceOfSupplyList.controller' // 添加该依赖 ], function ( ControllerExtension, OverrideExecution, formatter, SourceOfSupplyListController ) { "use strict"; return ControllerExtension.extend("customer.zTest.SourceOfSupplyListExtension", { // ... 原有metadata配置 override: { onInit: function () { alert("onInitOverride"); // ... 原有formatter重写逻辑 console.log(SourceOfSupplyListController); // 现在可正常访问控制器 debugger; } } }); });
2. 使用UI5控制器扩展的标准方式重写方法
不需要直接获取控制器对象,ControllerExtension原生支持重写目标控制器的方法,直接在override对象中声明要覆盖的方法即可:
override: { // 示例:重写SourceOfSupplyList.controller中的自定义方法 yourTargetMethod: function(oParam) { // 先调用原方法逻辑 this.base.yourTargetMethod(oParam); // 添加自定义扩展逻辑 console.log("目标方法已被重写并执行"); } }
3. 验证模块路径配置
检查项目manifest.json中的sap.ui5/resources配置,确保没有覆盖标准应用的命名空间ui/s2p/mm/sspreq/manages1,保证模块路径解析正确。
内容的提问来源于stack exchange,提问作者melai
相关产品推荐
相关产品推荐

