SAP UI5和CRM WebUI的View和Controller是如何绑定的

UI5

例如我在UI5的界面上画一个按钮,点击以后弹出一个Alert dialog。 编程

在XML view里只定义了controller的名称和事件处理函数的名称。那么按钮被点击以后,controller的onShowHello被触发。可是,这个controller的实例是何时被建立, 而且关联到这个申明它的XML view里呢?框架

在XMLView.js里,我定义的XML view的源代码被加载以后,XMLView会调用XMLTemplateProcessor, 解析XML view的内容,根据里面的control申明建立对应的UI5控件实例。下图的变量_xContent.innerHTML即为上图XML view的源代码。函数

XMLView的实例经过工厂模式建立以后,XMLView源代码里定义的controller名称sap.ui.demo.walkthrough.controller.App,会赋到oView实例的字段_controllerName上。ui

View和Controller的绑定是经过这个方法createAndConnectController完成:3d

connect controller to view after controller and control tree are fully initialized指针

Controller的实例也经过工厂模式建立:component

一旦connectToView执行以后,blog

oView和oController的关联关系就创建起来了。事件

CRM WebClient UI

每一个UI component view里有一个built-in的属性controller, 指向这个view对应的controller实例。开发

在BSP的编程环境里,开发人员根本无需操心这个controller实例的初始化,直接用就行。

那么View的controller实例究竟在何时被框架初始化的?

要本身搞清楚这个问题,能够随便找个BSP UI component作个实验。我找的是PRDHS。在其View的controller CL_PRDHS_HEADER_IMPL的构造函数里设置断点:

打开该view,从调用栈上下文便可得知BSP框架在什么地方初始化controller实例的。记下这个实例在ABAP runtime的地址编号4633:

同UI5逻辑相似,在CL_BSP_PAGE_BASE~CREATE_PAGE内部,第190行建立controller的实例并将其同View实例创建关联关系。

最后运行时View的controller实例4633和以前咱们在PRDHS/Header的controller CL_PRDHS_HEADER_IMPL的构造函数中的me指针4633同样,证实两个变量指向的是同一个实例。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

相关文章
相关标签/搜索