当前位置: 首页 > 后端技术 > Node.js

SAPUI5和CRMWebUI的View和Controller是怎么绑定的?

时间:2023-04-03 21:14:27 Node.js

UI5比如我在UI5界面上画了一个按钮,点击后弹出一个Alert对话框。在XML视图中只定义了控制器的名称和事件处理程序的名称。然后点击按钮后,就会触发controller的onShowHello。但是这个控制器的实例何时创建并与声明它的XML视图相关联呢?在XMLView.js中,加载我定义的XML视图的源码后,XMLView会调用XMLTemplateProcessor解析XML视图的内容,根据里面的控件声明创建对应的UI5控件实例。下图中的变量_xContent.innerHTML就是上图中XML视图的源码。通过工厂模式创建XMLView实例后,会将XMLView源码中定义的controller名称sap.ui.demo.walkthrough.controller.App赋值给oView实例的_controllerName字段。View和Controller的绑定是通过这个方法createAndConnectController完成的:controller和controltree完全初始化后controller和view的连接Controller实例也是通过工厂模式创建的:connectToView一旦执行,oView和oController的关系就建立起来了。CRMWebClientUI的每个UI组件视图都有一个内置的属性controller,指向这个视图对应的控制器实例。在BSP编程环境中,开发者根本不需要关心这个控制器实例的初始化,直接使用即可。那么框架什么时候初始化View的controller实例呢?想自己解决这个问题,可以找一个BSPUI组件做个实验。我正在寻找PRDHS。在View的controller的构造函数中设置断点CL_PRDHS_HEADER_IMPL:打开view,可以从调用栈上下文中知道BSP框架在哪里初始化了controller实例。记下这个实例在ABAP运行时的地址号4633:类似UI5逻辑,在CL_BSP_PAGE_BASE~CREATE_PAGE内部,第190行创建一个controller实例,并与View实例建立关联关系。最后,运行时View的控制器实例4633与PRDHS/Header控制器CL_PRDHS_HEADER_IMPL的构造函数中的me指针4633相同,证明两个变量指向同一个实例。