当前位置: 首页 > 后端技术 > Node.js

SAPFiori中的List是如何实现懒加载的?

时间:2023-04-03 14:54:11 Node.js

今天有同事问我这个问题:S/4HANAFiori应用中的List一旦滚动到底部,会自动向后台发起新的请求获取更多的数据读到前台显示。以ProductMaster应用程序为例。我点击搜索后,结果区显示当前系统有140个产品,但浏览器中只返回前25个显示。这种分页效果是通过UI5OData的参数实现的:$skip=0&top=25。总数140是通过参数$inlinecount实现的,其原理类似于ABAPOpenSQL的SELECTCOUNT(*)。从Chrome开发者工具可以观察到前25个产品的payload:当列表滚动到底部时,从后台读取第二批25个产品显示在前台:本次http请求的参数:$skip=25&top=25,用于读取第25到第50个产品。从调用栈可以清楚的发现,第二批商品阅读动作是由滚动事件触发的。然后去GrowingEnablement.requestNewPage的调用栈,发现有一个属性_iLimit维护了一个startindex。每次触发滚动到底部事件时,该属性值将通过GrowingThreshold进行累加。因为APIthis._oControl.getGrowingThreshold每次返回一个常量值25,所以每次滚动到底部后_iLimit的值是这样的:25、50、75、100...这些值都会被使用作为HTTP请求参数$skip的值传递给后台:同事的问题:growingThreshold在文件sap.m.ListBase.js中硬编码为20,但是在运行时在哪里改写为25?要回答这个问题,需要了解UI5SmartTemplate的一些知识,因为示例中ProductMaster的Fiori应用也是基于SmartTemplate开发的。可以参考我的博客MyunderstandingaboutobjectpageinSmartTemplateisrendered了解其工作原理。当ProductMaster应用的UIComponent被加载并立即开始渲染时,需要先加载SmartTemplate库文件:在我的博客中我对SmartTemplate中对象页面是如何渲染的理解,在文件ListReport中有提到。view.xml里面有几个viewfragment的声明,每个声明都指向一些其他的SmartTemplate库文件。这些库文件的列表:在Chrome开发者工具中查看从ABAP后台加载的库文件SmartTable.fragment.xml,可以发现这里growingThreshold属性硬编码为25。加载SmartTable.fragment.xml时会解析其内容,growingThreshold值为25,通过控件的setterAPI写入控件属性。这样,接下来处理列表的滚动事件时,就会通过控件的getterAPI返回25的值,并添加到_iLimit中。XML视图从ABAP后台加载到浏览器后是如何解析并生成对应的UI5控件的,可以参考我的博客Whymyformatterdoesnotwork?一个故障排除示例,了解它是如何工作的也许你按照我上面描述的步骤操作,但是无法触发断点。原因是UI5框架为基于SmartTemplate开发的Fiori应用的XML视图设计了缓存机制。当要渲染的XML视图在缓存中已经存在时,不会去ABAP后台加载SmartTemplate库文件,而是直接执行428行的IF分支。通过调试可以发现实现了缓存通过IndexedDB加上LRU(Leastrecentlyused)算法。通过Chrome开发者工具,可以观察到要渲染的视图已经记录在IndexedDB中:如果要观察SmartTemplate库文件的加载,需要点击“删除数据库”,手动清除缓存。清除缓存后,您可以观察到预期的智能模板库文件加载。这篇文章描述了如何调试以找到同事提出的问题的答案。加入我的UI5调试文章合集:我的UI5调试技巧和经验合集——如何通过自己调试解决UI5问题