SAP Fiori里的List是如何做到懒加载Lazy load的
今天一同事问我这个问题:S/4HANA Fiori应用里的列表,一旦Scroll到底部就会自动向后台发起新的请求把更多的数据读取到前台显示。
以Product Master这个应用为例,我点击搜索之后,结果区域显示当前系统一共有140个product,但是只有前25个返回并显示在浏览器里。
这个分页效果是UI5 OData的参数实现的:$skip=0&top=25。
而总数140,是通过参数$inlinecount实现,其原理和ABAP Open SQL的SELECT COUNT(*)类似。
从Chrome开发者工具能观察到头25个product的payload:
当将列表滚动至底部时,第二批共25个product从后台读取出来,显示在前台:
这个http请求的参数:$skip=25&top=25,用于读取从第25个到第50个product。
从调用栈能清楚发现是scroll这个事件触发的第二批product的读取动作。
然后再去GrowingEnablement.requestNewPage这一个调用栈,发现一个属性_iLimit维护了一个开始索引,每次scroll到底部的事件触发之后,该属性值都会被GrowingThreshold累加。 因为API this._oControl.getGrowingThreshold每次返回的是一个常量25, 因此_iLimit的值每次scroll到底部之后看起来是这样的:25,50,75,100 … 这些值会被用来作为HTTP请求参数$skip的值传到后台:
我同事的问题:growingThreshold在文件sap.m.ListBase.js里被硬编码成20, 但是运行时在何处被改写成了25?
要回答这个问题,需要了解一些UI5 Smart Template的知识,因为例子里这个Product Master的Fiori应用,也是基于Smart Template开发的。可以参考我的博客My understanding about how object page in Smart Template is rendered 来了解其工作原理。
当Product Master这个应用的UI Component被加载并马上开始渲染时,需要先加载Smart Template的库文件:
在我博客My understanding about how object page in Smart Template is rendered 提到,ListReport.view.xml这个文件里有若干view fragment的声明,每个声明指向了一些其他的Smart Template库文件。
这些库文件一览:
在Chrome开发者工具查看从ABAP后台加载的库文件SmartTable.fragment.xml,能发现属性growingThreshold在此处被硬编码成25。
当SmartTable.fragment.xml被加载之后其内容会被解析, growingThreshold值为25,会通过控件的setter API写入到控件属性里。这样接下来在处理列表的scroll事件是,25这个值就会通过控件的getter API返回并累加到_iLimit上。
关于XML view从ABAP后台加载到浏览器后是如何被解析并生成对应的UI5控件,可以参考我的博客Why my formatter does not work? A trouble shooting example to know how it works
也许您按照我上面描述的步骤操作,但是无法触发断点。原因是因为UI5框架针对基于Smart Template开发的Fiori应用的XML view设计了一套缓存机制。当待渲染的XML view已经在缓存中存在时,不会去ABAP后台加载Smart Template的库文件, 而是直接执行第428行的IF分支。
通过调试我们可以发现缓存是通过IndexedDB加上LRU(Least recently used)算法实现的。
通过Chrome开发者工具可以观察到待渲染的view已经有记录存储在IndexedDB里了:
如果想观察Smart Template库文件的加载,需点击"Delete database"以手动清除缓存。
缓存清除完毕后,即可观察到期望中的Smart Template库文件加载。
这篇文章介绍了如何通过调试找到同事提出问题的答案。我把它加在了我UI5调试文章分享的合集里:My UI5 debugging tips and experience collection - how to resolve UI5 issues through debugging by yourself
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙":
SAP Fiori里的List是如何做到懒加载Lazy load的相关推荐
- SAP Commerce Cloud (电商云) UI 的懒加载功能
最近工作中处理了 SAP Commerce Cloud (电商云) UI 的一个懒加载 (Lazy Load) 功能的问题,这里把自己学到的东西做个记录. UI 懒加载,有时又称惰性加载,延迟加载,是 ...
- SAP CRM WebClient UI和Hybris Commerce的懒加载机制
在WebUI里,如果不勾上assignment的Display Expanded, 在runtime时就不会有到后台取assignment block数据的roundtrip. 在Hybris ser ...
- 深入学习SAP UI5框架代码系列之一:UI5 Module的懒加载机制
本文是深入学习SAP UI5框架代码系列的第二篇文章. 系列目录 SAP UI5应用开发人员了解UI5框架代码的意义 UI5 module懒加载机制 UI5 控件渲染机制 HTML原生事件 VS SA ...
- webbrowser控件 加载为空白_深入学习SAP UI5框架代码系列之一:UI5 Module的懒加载机制...
本文是深入学习SAP UI5框架代码系列的第二篇文章. 系列目录 SAP UI5应用开发人员了解UI5框架代码的意义 UI5 module懒加载机制 UI5 控件渲染机制 HTML原生事件 VS SA ...
- SAP Spartacus 懒加载 Customized CMS Component 的问题
Lazy-loaded overriden or custom CMS Components SAP Spartacus 有两种 lazy load 方式: CMS-driven lazy loadi ...
- SAP Fiori里的Adapt UI按钮,神出鬼没的奥秘
今天是2020年2月2日鼠年大年初九,这是Jerry鼠年的第9篇文章,也是汪子熙公众号总共第208篇原创文章. 这几天大家在家一日游的感觉如何? 工作中Jerry的同事曾经问过我一个问题,Fiori界 ...
- SAP Spartacus CMS Component的lazy loading懒加载方式
代码如下: ConfigModule.withConfig({cmsComponents: {SimpleResponsiveBannerComponent: {component: () => ...
- SAP 电商云 Spartacus UI Component 级别的延迟加载实现(Lazy Load)
注:Spartacus 推荐客户尽量使用 feature 级别的 lazy load,而非 Component 级别的 lazy load. 后者的具体实现步骤: app 文件夹下新建一个 cms-c ...
- SAP Spartacus B2B Org Unit树状结构的加载机制
list.service.ts里的pagination作为出发点: 我在unit list service里设置一个断点,停下来就行了? 事实证明不行,看来要在effect里设置断点才行.在load里 ...
最新文章
- 硬币(计算n分有几种表示法)
- 宏病毒的研究与实例分析05——无宏文件携带宏病毒
- 现有CSDN博客的排名机制
- 3.QT事件处理,消息过滤器
- 实战渗透之一个破站日一天
- Internationalization(i18n) support in SAP CRM,UI5 and Hybris
- 为什么要free释放内存_为什么在Free Code Camp上列出一份工作要花1,000美元?
- 【RK3399Pro学习笔记】八、ROS话题消息的定义与使用
- 浏览器与服务器响应流程-----(转)
- 史上最全Oracle数据泵常用命令
- 2017年度优秀软件工程造价师等评选通知
- 使用bat一键修改ip地址(包括静态、动态ip)
- 计算机房的英语怎么读音,机房位置,Host equipment room,音标,读音,翻译,英文例句,英语词典...
- matlab读取文本文件----textscan
- 信息安全概论课堂笔记
- 十大热门经典历史小说,大有希望获得第四届橙瓜网络文学奖
- js 关键技术集合
- yarn : 无法加载文件 D:\Development\nvm\node_global\yarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.c
- 用标志域tag判断队空队满的入队和出队算法
- kotlin Anko的实际用法
热门文章
- 文献记录(part59)--多任务学习
- 第三次学JAVA再学不好就吃翔(part26)--static关键字
- 网络编程(part7)--网络主机/IP地址/域名/端口号
- 鸡兔同笼问题的一些巧解
- SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍试读版
- 避免修改构造函数输入参数引起的 breaking change
- 使用 Rxjs 解决 Angular Component 之间的通信问题
- SAP 电商云 Spartacus UI 设置 delivery mode 在 3G 慢速网络下的排队效果
- 关于 SAP 产品 UI 的搜索引擎优化 SEO - Search Engine Optimization
- SAP Spartacus 服务器端 nodejs 应用里渲染 Angular Component 的一个例子