如何在SAPUI5中使用带参数构造函数的TypeScript控制器?
解决SAPUI5 TypeScript控制器构造函数参数undefined的问题
首先得明确一个关键核心:SAPUI5框架会全权负责控制器的实例化过程,它不会按照你自定义的构造函数签名来传递参数,这就是为什么你传入的JSONModel始终是undefined的根本原因。控制器的构造函数调用是框架内部处理的,我们不能直接通过自定义构造函数参数来传递模型这类依赖。
结合你的代码场景,给你两种可行的解决方案:
方案一:在onInit生命周期钩子中处理JSONModel
这是SAPUI5控制器中处理依赖最常用的方式,onInit是控制器初始化时框架会自动调用的方法,在这里处理模型逻辑完全符合框架的设计规范。
修正后的TypeScript代码示例:
sap.ui.define([ "worklist/controller/BaseController", "sap/ui/model/json/JSONModel" ], (BaseController: typeof worklist.controller.BaseController, JSONModel: typeof sap.ui.model.json.JSONModel) => { "use strict"; namespace worklist.controller { export class View1 extends BaseController { private oLocalModel: JSONModel; public onInit(): void { super.onInit(); // 务必调用父类的onInit方法,保证基础逻辑执行 console.clear(); console.info("name initialized"); // 场景1:创建新的JSONModel并绑定到当前视图 this.oLocalModel = new JSONModel({ // 这里填入你的初始化数据 userName: "Test User", dataList: [] }); this.getView().setModel(this.oLocalModel); // 场景2:从组件获取全局已定义的模型 // this.oLocalModel = this.getOwnerComponent().getModel("globalJsonModel") as JSONModel; } onBeforeRendering(): void { console.info("name onBeforeRendering"); } onAfterRendering(): void { const router = this.getRouter(); console.info("name onAfterRendering"); } onExit(): void { console.info("name onExit"); } } } return worklist.controller.View1; });
方案二:通过组件/路由传递外部已创建的模型
如果你的JSONModel是在其他模块(比如组件、另一个控制器)中创建好的,需要传递给View1控制器,可以选择以下方式:
- 组件级别共享:在组件的初始化方法中设置全局模型,然后在View1的
onInit里通过this.getOwnerComponent().getModel("模型名称")获取。 - 路由关联传递:如果模型和路由参数绑定,可以在路由配置中传递标识参数,然后在
onRouteMatched事件中根据参数获取或初始化对应模型。
额外纠正:原代码中的冲突点
你原代码同时使用了Controller.extend和TypeScript的class继承,这两种方式在SAPUI5+TypeScript的场景下不需要同时使用,统一用TypeScript的类继承即可,避免混淆框架的原型链逻辑。
另外,不要轻易重写控制器的构造函数——框架在创建控制器时会执行很多内部初始化工作(比如路由绑定、视图关联等),自定义构造函数很容易破坏这些底层逻辑,这也是参数异常的潜在诱因之一。
内容的提问来源于stack exchange,提问作者Atul Chaudhary
相关产品推荐
相关产品推荐

