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從後臺讀取出來,顯示在前臺:ui

這個http請求的參數:$skip=25&top=25,用於讀取從第25個到第50個product。this

從調用棧能清楚發現是scroll這個事件觸發的第二批product的讀取動做。編碼

而後再去GrowingEnablement.requestNewPage這一個調用棧,發現一個屬性_iLimit維護了一個開始索引,每次scroll到底部的事件觸發以後,該屬性值都會被GrowingThreshold累加。 由於API this._oControl.getGrowingThreshold每次返回的是一個常量25, 所以_iLimit的值每次scroll到底部以後看起來是這樣的:25,50,75,100 ... 這些值會被用來做爲HTTP請求參數$skip的值傳到後臺:debug

我同事的問題: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的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼:

相關文章
相關標籤/搜索