当前位置: 首页 > Web前端 > HTML5

如何在运行时创建SAPUI5xml视图中定义的控件实例?

时间:2023-04-05 13:41:06 HTML5

入口函数在XMLTemplateProcessor中:解析xml视图源码后,调用createRegularControls创建实例:这是我的xml视图源码:invoiceListTitle}"class="sapUiResponsiveMargin"width="auto"items="{invoice>/Invoices}">Quantity}x{invoice>ProductName}"number="{parts:[{path:'invoice>ExtendedPrice'},{path:'view>/currency'}]类型:'sap.ui.model.type.Currency',格式选项:{showMeasure:false}}"numberUnit="{view>/currency}"/>number字段的绑定路径解析:在BindingParser的代码中,上面string类型的绑定路径被解析为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异步编程模型:functionloadResourceAsync(sResourceName){returnLoaderExtensions.loadResource(sResourceName,{async:true}).then(function(oData){returnoData.documentElement;//结果是文档节点});}LoaderExtensions.loadResource执行异步加载xml视图文件的任务,加载成功的结果通过入参oData传递给匿名回调函数。进入loadResource里面:forwardtosap.ui.loader._.getModuleContent(sResourceName,mOptions.url);从缓存中读取。因为是第一次加载,所以没有命中缓存:仍然使用jQuery.ajaxapi加载数据:加载成功后,调用335行的成功回调函数:的dataType字段值ajax请求为xml:加载成功的xml文档Object:调用resolve方法,将xml文档传递给promiseapi的then回调函数。这里我们开始递归解析xml文档的节点:对于(vari=0;i