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

原文地址:https://www.cnblogs.com/sap-jerry/p/8684250.html

时间: 2024-10-16 07:36:20

SAP Fiori里的List是如何做到懒加载Lazy load的的相关文章

提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载

要求:手机端打开某个页面的详细信息,因为网速或者别的原因,响应太慢,因为图片大的原因,希望先进来,图片在网页运行的情况再慢慢加载(jquer延迟加载) http://www.w3cways.com/1765.html()  困难:因为页面的图片是用编辑器加进去的        :图片与文字存到数据库的字段中 :实现思路:从数据库中读取这个字段,把字段里面的src替换成lazyload 然后再返回给页面 这里主要讲是怎么把从数据库取到的数据里面的字段里面的值替换然后与页面直接的数据转换 首先 pu

Qt做发布版,解决声音和图片、中文字体乱码问题(需要在main里写上QApplication::addLibraryPath("./plugins")才能加载图片,有图片,很清楚)

前些天做Qt发布版,发现居然不显示图片,后来才发现原来还有图片的库没加!找找吧,去qt的安装包,我装在了F盘,在F盘F:/QT/qt/plugins,找到了plugins,这里面有个 imageformats是图片的库,里面有jpg,gif等,你用到那种格式就加那种!加的时候一点过要注意,将imageformats这个文件夹考到你的程序当前文件夹内!并在主函数里加:QApplication::addLibraryPath("./plugins"); 这样你的带图片的发布版就做好了! 看

一步步把SAP GUI的事务码配置到SAP Fiori Launchpad里

今天是2020年1月31日鼠年大年初七,这是Jerry鼠年的第7篇文章,也是汪子熙公众号总共第206篇原创文章. Jerry之前的文章 为什么SAP GUI里的传统事务码能通过Fiori Launchpad启动 介绍了SAP GUI的事务码能够运行在SAP Fiori Launchpad里的原理,今天我们就来实际动手做一做,将SE80配置到SAP Fiori里并在浏览器里使用它. Jerry上高中时,正是暴雪公司发布即时战略神作<星际争霸>的时候,当时课堂上,下课后,教室里,操场上,同学们几乎

单步调试理解webpack里通过require加载nodejs原生模块实现原理

在webpack和nodejs里,我们经常使用require函数加载原生模块或者开发人员自定义的模块. 原生模块的加载,比如: const path = require("path"); 这个语句是webpack和nodejs应用里经常使用到的.今天就来谈谈它的实现原理. 还是通过单步调试的方式来学习. 大家首先得通过我前一篇文章webpack打包过程如何调试?学会如何调试webpack打包过程. require函数的实现位于file:///internal/module.js 注意看

为什么SAP GUI里的传统事务码能通过Fiori Launchpad启动

今天是农历鼠年大年初六,本文是鼠年第6篇文章,也是汪子熙公众号第205篇原创文章. 大家这几天宅得怎么样了? Jerry之前的文章 那些年我用过的SAP IDE 曾经提到,我们可以把SAP GUI里的传统事务码放到SAP Launchpad里启动,并在浏览器里运行. 这是SE80在浏览器里运行的界面: 为响应government号召,尽量少出门,反正也闲着没事,今天我们就来聊聊这一切是怎么实现的. Jerry最初注意到这种将SAP GUI里的事务码运行在浏览器里的做法,是在日常工作的测试时,发现

揭开SAP Fiori编程模型规范里注解的神秘面纱 - @OData.publish

今天是2020年2月1日鼠年大年初八,这是Jerry鼠年的第8篇文章,也是汪子熙公众号总共第207篇原创文章. Jerry的前一篇文章 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @ObjectModel.readOnly工作原理解析,给大家分享了@ObjectModel.readOnly这个注解对应的Fiori UI和ABAP后台的工作原理. 今天我们继续研究另一个注解@OData.publish. 在SAP官网的ABAP Programming Model for SAP Fio

SAP Fiori和UI5的初学者导航

你是UI5和Fiori的新手?来对地方了. 对我来说,今年是不得不“跟上时代”去提升自己ABAP世界以外的技术技能的困难的一年.幸运的是,有很多可免费获得的信息和课程可以帮你实现这个跳跃.不要等着别人送你去训练——自己花时间提高技能! (译者注:原作者使用了大量的“great”作为形容词,我根据情景翻译为“好”.“优秀”.“很好”等,尽管如此,我还是感觉到了自己用词上的贫乏,有些地方可能无法尽达其意) 学习web技术技能 了解UI5的基础部分HTML, CSS, Javascript和JQuer

浅谈SAP Fiori的设计美感与发展历程

公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]浅谈SAP Fiori的设计美感与发展历程 前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 最近一段时间比较忙,有很多读者的消息没有及时回复,公众号里消息回复有时长限制,而且超过时间就不能回复了,大家也可以选择在文章末尾留言,这样就不会有时间限制. 我在之前的文章推送里写了关于SAP Fiori的文

SAP Fiori应用的三种部署方式

封面图片来自Google搜索,关键字: Fiori Deployment 方式1 On premise环境下以BSP应用作为Fiori应用部署和运行的载体 典型的例子是SAP CRM这几个Fiori应用: 在Google上搜索关键字Fiori Architecture, 能找到这样一张图片,其中CRM和S/4 HANA的Fiori应用都以BSP应用的方式运行在下图我标注了红色方框的ABAP前台服务器上. 以CRM的My lead应用为例,在Chrome的development tool里能找到其