zoukankan      html  css  js  c++  java
  • 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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/8724385.html
Copyright © 2011-2022 走看看