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上。
View和Controller的绑定是通过这个方法createAndConnectController完成:
connect controller to view after controller and control tree are fully initialized
Controller的实例也通过工厂模式创建:
一旦connectToView执行之后,
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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kotlin和Java混合开发必读:基本的互操作
在使用Kotlin和Java混合开发的时候,涉及到一些基本的互操作 一、属性的读写 1.Kotlin自动识别Java的属性的Getter和Setter 2.Java操作kotlin属性可以通过Getter和Setter的方式 二、空安全类型 1.Kotlin空安全类型的原理 空安全类型在Java中是没有的,在Kotlin中才有这个东西的。 Kotlin在编译的时候,会增加一个函数的调用,对参数值和返回值进行是否为空安全检查 可以通过事先确定哪些允许为空,哪些不允许。 可以通过使用@Nullable和@NotNull来弥补 三、几类函数的调用问题 1.包级函数:静态方法 包级函数在Kotlin中有,在Java中没有。 Kotlin在编译的时候,会为kotlin生成一个类,这个类包含了所有的包级函数,在Java看来,这些都是静态方法,Java在调用的时候,只需要按照静态方法的方式去调用就好了 2.扩展方法:带Receiver的静态方法 3.运算符重载:带Receiver的对应名称的静态方法 四、几个常见注解的使用 1.@JvmField:将属性编译为Java变量 是Kotlin和Java相...
- 下一篇
JAVA学习笔记--类型转换(父类子类 Object 基本类型 String) 拆装箱 包装类
最近一段时间忙着学习JAVA,本来net学的也不怎么好,趁着这个机会转下方向学习JAVA。 不过.NET core的开源还是有点搞头的,微软了解一下。 接下来几天我也会陆续写一些内容关于线程和集合等方面,现在让我来讲一下类型转换的内容吧。 衍生知识: 1.基本类型比较用== 而对象比较用equals 如果改写了equals 那么也要顺便改写 hascode 别问为什么,只是习惯。 equals是比较引用是否指向一个对象 hasCode是返回对象 地址。 2.System.out.println(对象); println方法里默认调用了toString() 而toString()默认是返回对象的完整类名+@+地址。有些对象会改写toString() 比如ArraysList对象的toString()就是输出数组的每一个元素外加[] 3.当 "=="运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如 果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程) 5.基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上; 引...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题