UI5
例如我在UI5的界面上画一个按钮,点击之后弹出一个Alert dialog。
![](https://img.haomeiwen.com/i2085791/0c882f69dc9a7b2a.png)
在XML view里只定义了controller的名称和事件处理函数的名称。那么按钮被点击之后,controller的onShowHello被触发。但是,这个controller的实例是什么时候被创建, 并且关联到这个申明它的XML view里呢?
![](https://img.haomeiwen.com/i2085791/fbff3f0c0286f3e0.png)
在XMLView.js里,我定义的XML view的源代码被加载之后,XMLView会调用XMLTemplateProcessor, 解析XML view的内容,根据里面的control申明创建对应的UI5控件实例。下图的变量_xContent.innerHTML即为上图XML view的源代码。
![](https://img.haomeiwen.com/i2085791/483d05a36520bef1.png)
XMLView的实例通过工厂模式创建之后,XMLView源代码里定义的controller名称sap.ui.demo.walkthrough.controller.App,会赋到oView实例的字段_controllerName上。
![](https://img.haomeiwen.com/i2085791/6db00597ca0c9a33.png)
View和Controller的绑定是通过这个方法createAndConnectController完成:
connect controller to view after controller and control tree are fully initialized
![](https://img.haomeiwen.com/i2085791/dbe6c88e3677b53f.png)
Controller的实例也通过工厂模式创建:
![](https://img.haomeiwen.com/i2085791/0eeebfdc914ec013.png)
一旦connectToView执行之后,
![](https://img.haomeiwen.com/i2085791/3b26fccb6b4ac910.png)
oView和oController的关联关系就建立起来了。
![](https://img.haomeiwen.com/i2085791/74c25c408cd60c4a.png)
CRM WebClient UI
每个UI component view里有一个built-in的属性controller, 指向这个view对应的controller实例。
![](https://img.haomeiwen.com/i2085791/389cafe1f2b7f7c9.png)
在BSP的编程环境里,开发人员根本无需操心这个controller实例的初始化,直接用就行。
那么View的controller实例究竟在什么时候被框架初始化的?
要自己搞清楚这个问题,可以随便找个BSP UI component做个实验。我找的是PRDHS。在其View的controller CL_PRDHS_HEADER_IMPL的构造函数里设置断点:
![](https://img.haomeiwen.com/i2085791/c85658e4e564429a.png)
打开该view,从调用栈上下文即可得知BSP框架在什么地方初始化controller实例的。记下这个实例在ABAP runtime的地址编号4633:
![](https://img.haomeiwen.com/i2085791/5aee984e0c446e7b.png)
同UI5逻辑类似,在CL_BSP_PAGE_BASE~CREATE_PAGE内部,第190行创建controller的实例并将其同View实例建立关联关系。
![](https://img.haomeiwen.com/i2085791/6ef0e3c7d3fd5841.png)
最后运行时View的controller实例4633和之前我们在PRDHS/Header的controller CL_PRDHS_HEADER_IMPL的构造函数中的me指针4633一样,证明两个变量指向的是同一个实例。
![](https://img.haomeiwen.com/i2085791/35af72dcb302d1ab.png)
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
![](https://img.haomeiwen.com/i2085791/2486f3bd80b6ca71.png)
![](https://img.haomeiwen.com/i2085791/459dc9b052f3c62d.png)
网友评论