关于javascript:SAP-UI5-xml-视图里定义的控件运行时如何创建其实例的

6次阅读

共计 1727 个字符,预计需要花费 5 分钟才能阅读完成。

入口函数在 XMLTemplateProcessor 里:

解析 xml 视图的源代码之后,调用 createRegularControls 进行实例创立:

这是我的 xml 视图源代码:

<mvc:View
   controllerName="sap.ui5.walkthrough.controller.InvoiceList"
   xmlns="sap.m"
   xmlns:mvc="sap.ui.core.mvc">
   <List
      headerText="{i18n>invoiceListTitle}"
      class="sapUiResponsiveMargin"
      width="auto"
      items="{invoice>/Invoices}">
      <items>
         <ObjectListItem
      title="{invoice>Quantity} x {invoice>ProductName}"
      number="{parts: [{path: 'invoice>ExtendedPrice'}, {path: 'view>/currency'}],
         type: 'sap.ui.model.type.Currency',
         formatOptions: {showMeasure: false}
      }"numberUnit="{view>/currency}"/>
   </items>
   </List>
</mvc:View>

number 字段的绑定门路被解析了进去:

在 BindingParser 的代码里,上述字符串类型的绑定门路,被解析成了 json 对象:

这里调用 sap.ui.model.type.Currency 的构造函数。

咱们再回过头来看 xml 视图的加载和解析过程。

在 XMLView.js 的 this._xContent 字段里,咱们能找到 xml 视图的字符串格局的源代码。

在 XMLView.js 里依据字符串 _xContent 进行搜寻,即可查到这个字段赋值的地位:

在代码第 607 行触发 xml 视图文件的加载:

从办法名也能看出,xml 视图文件采纳异步的形式进行加载:

loadResourceAsync(sResourceName).then(runPreprocessorsAsync).then(processView);

这里采纳了 promise 异步编程模型:

        function loadResourceAsync(sResourceName) {return LoaderExtensions.loadResource(sResourceName, {async: true}).then(function(oData) {return oData.documentElement; // result is the document node});
        }

LoaderExtensions.loadResource 执行异步加载 xml 视图文件的工作,加载胜利的后果,通过输出参数 oData 传递到匿名回调函数内。

进入 loadResource 外部:

转发给 sap.ui.loader._.getModuleContent(sResourceName, mOptions.url);


从缓存里读取。因为是第一次加载,缓存没有命中:

最终还是用的 jQuery.ajax api 去加载的数据:

加载胜利后,调用 335 行的 success 回调函数:


ajax 申请的 dataType 字段值为 xml:


加载胜利的 xml document 对象:

调用 resolve 办法,将 xml document 传给 promise api 的 then 回调函数。

此处就开始递归地解析 xml document 的节点了:

function parseChildren(xmlNode, bRoot, bIgnoreToplevelTextNodes, pRequireContext) {
            var children = xmlNode.childNodes;
            for (var i = 0; i < children.length; i++) {parseNode(children[i], bRoot, bIgnoreToplevelTextNodes, pRequireContext);
            }
        }

parseChildren 调用 parseNode.

更多 Jerry 的原创文章,尽在:” 汪子熙 ”:

正文完
 0