深入學習SAP UI5框架代碼系列之五:SAP UI5控制項的實例數據修改和...

2021-01-07 汪子熙的編程和遊泳

這是Jerry 2021年的第 6篇文章,也是汪子熙公眾號總共第 277 篇原創文章。系列目錄(0) SAP UI5應用開發人員了解UI5框架代碼的意義(1) SAP UI5 module懶加載機制(2) SAP UI5 控制項渲染機制(3) HTML原生事件 VS SAP UI5 Semantic事件(4) SAP UI5控制項元數據的元數據實現(5) SAP UI5控制項的實例數據修改和讀取邏輯(本文)(6) SAP UI5控制項數據綁定的實現原理(7) SAP UI5控制項數據綁定的三種模式:One Way,Two Way和OneTime實現原理比較(8) SAP UI5控制項ID的生成邏輯(9) SAP UI5控制項的多語言(國際化,Internationalization,i18n)支持的實現原理(10) XML視圖裡的button控制項(11) button控制項和它背後的DOM元素本文我們將通過研究button控制項的setText和getText方法實現,來學習SAP UI5控制項的實例數據修改和讀取邏輯。下圖是一段簡單的SAP UI5代碼:每點擊一次button,就會在press事件的響應函數裡,給button的text屬性值尾部附上一個字符「1」.

點了三次按鈕後,其渲染出的HTML代碼如下圖所示,button的text屬性後面多了三個"1":

單步調試進入setText方法內部,發現該方法最終執行的實現是ManagedObject.setProperty:

我們可以通過上圖右邊調用棧裡實現,複習本系列之前文章學到的兩個知識點:(1) 文章 深入學習SAP UI5框架代碼系列之一:UI5 Module的懶加載機制裡提到的SAP UI5控制項的原型繼承鏈:Button->Control->Element->ManagedObject->EventProvider->BaseObject(2) 文章 HTML原生事件 VS SAP UI5 Semantic事件 裡提到的從HTML原生的click事件到SAP UI5 press語義事件的映射邏輯。setProperty的實現邏輯概述注釋寫得很棒,不過setProperty的代碼本身的執行邏輯也很清晰。

第1295行this.mProperties即SAP UI5控制項的實例數據存儲結構。上圖右上角Watch面板裡的含義是,當前setProperty方法調用,需要修改text屬性,修改成新的值為"Button1".1295行首先從this.mProperties中取出text屬性修改前的值,存儲在變量oOldValue裡。1298行調用this.validateProperty方法,檢查傳入setProperty的輸入參數,即待修改的屬性值oValue是否有效。1300行判斷修改前的值oOldValue,和待修改的輸入值oValue是否相同。如果相同,當前setProperty調用沒必要繼續執行,直接返回。在validateProperty內部,SAP UI5框架根據本系列前一篇文章 深入學習SAP UI5框架代碼系列之四:SAP UI5控制項的元數據實現描述的邏輯, 取出控制項text屬性的元數據,得知該屬性類型為string,訪問權限為public:

每個不同類型的SAP UI5控制項屬性,根據其元數據的type欄位,可以得到一個對應的類型描述器,如上圖1409行oType所示。描述器裡包含一系列方法,其中normalize函數負責在寫入新的屬性值時,對輸入值進行規則化處理。

在setProperty調用時,最後一個可選的輸入參數bSuppressInvalidate,默認值為undefined,因此會執行1316行的invalidate方法,觸發UI的重繪操作(rerendering)。

上圖第1313行只是將新的屬性值寫入SAP UI5控制項的實例數據存儲結構裡,該行代碼執行完畢後,UI上的button標籤文本並不會變化。只有當UI界面重繪完成後,用戶才能在瀏覽器裡看到button標籤的最新值。上圖1316行的invalidate方法,會以異步的方式觸發UI重繪操作。異步操作的調度,採用JavaScript原生函數setTimeout, 該函數將renderPendingUIUpdates這個任務添加到JavaScript引擎任務隊列的尾部,這樣主線程一旦空閒(因為setTimeout第二個參數,即超時時間指定為0),就會執行renderPendingUIUpdates,以重繪UI區域裡需要重繪,即屬性值發生了變化的那些控制項。

Button控制項的重繪,最終通過其對應的渲染器,ButtonRenderer來實現,具體的渲染方法render的調用,如上圖右部標註了數字4的調用棧棧幀所示。關於SAP UI5控制項的渲染器,請查看Jerry之前的文章 深入學習SAP UI5框架代碼系列之二:UI5 控制項的渲染器。再回到ManagedObject.setProperty的方法主體。1320行的this.updateModelProperty, 涉及到SAP UI5控制項對應的模型更新,在代碼1319行注釋裡提到,如果控制項使用雙向綁定方式同一個模型綁定,那麼當UI控制項屬性發生變化時,對應的模型欄位也應該被更新。這個模型欄位的更新就實現在1320行的updateModelProperty函數裡,Jerry的下一篇文章 UI5控制項數據綁定的實現原理會介紹。

ManagedObject.setProperty的末尾,會調用實現在原型鏈節點EventProvider上的fireEvent方法,拋出一個_change事件,包含發生該事件的控制項id,發生change的屬性名稱,變化前和變化後的屬性值。

雖然事件名稱_change前面的下劃線表明該事件用於SAP UI5框架內部處理,然而這只是一個弱約束,我們依舊可以在自己的應用程式裡,使用下圖高亮區域裡button控制項的attachEvent方法,來監聽這個事件。下圖右部分調試器Watch面板裡展示的是_change事件的負載,表明一個id為__button0的控制項,text屬性值從Jerry變成了Jerry1.

以上就是button控制項的setText->setProperty的執行邏輯的大致介紹,了解了SAP UI5控制項數據修改的原理,理解getText就容易多了。前面介紹setProperty的時候提到了執行UI重繪的異步操作,發生在renderPendingUIUpdates函數裡,這裡button控制項的渲染器ButtonRenderer的render方法會被調用。渲染器又調用button的getText方法,取出待渲染的button標籤值。

而getText同setText類似,轉而調用ManagedObject的getProperty方法:

getProperty的核心邏輯比setProperty簡單得多,直接從控制項實例數據存儲結構mProperties裡取出對應需要讀取的屬性值。

順便說一句,Angular同SAP UI5一樣,也有類似的UI異步重繪操作。每當Angular內部維護的微任務隊列為空時,(onMicrotaskEmpty), 觸發tick操作:

tick操作調用detectChanges函數(相當於SAP UI5的renderPendingUIUpdates), detectChanges會遞歸調用refreshView, 刷新發生了屬性變化的Angular控制項。

本系列的下一篇文章,會介紹SAP UI5控制項數據綁定的實現原理,感謝閱讀。

更多閱讀(0) SAP UI5應用開發人員了解UI5框架代碼的意義(1) SAP UI5 module懶加載機制(2) SAP UI5 控制項渲染機制(3) HTML原生事件 VS SAP UI5 Semantic事件(4) SAP UI5控制項元數據的元數據實現(5) SAP UI5控制項的實例數據修改和讀取邏輯(本文)(6) SAP UI5控制項數據綁定的實現原理(7) SAP UI5控制項數據綁定的三種模式:One Way,Two Way和OneTime實現原理比較(8) SAP UI5控制項ID的生成邏輯(9) SAP UI5控制項的多語言(國際化,Internationalization,i18n)支持的實現原理(10) XML視圖裡的button控制項(11) button控制項和它背後的DOM元素

相關焦點

  • 深入學習SAP UI5框架代碼系列之六:SAP UI5控制項數據綁定的實現原理
    系列目錄(0) SAP UI5應用開發人員了解UI5框架代碼的意義(1) SAP UI5 module懶加載機制(2) SAP UI5 控制項渲染機制(3) HTML原生事件 VS SAP UI5 Semantic事件(4) SAP UI5控制項元數據的元數據實現(5) SAP UI5控制項的實例數據修改和讀取邏輯
  • 深入學習SAP UI5框架代碼系列之一:UI5 Module的懶加載機制
    本文是深入學習SAP UI5框架代碼系列的第二篇文章。系列目錄(0) SAP UI5應用開發人員了解UI5框架代碼的意義(1) UI5 module懶加載機制(本文)(2) UI5 控制項渲染機制(3) HTML原生事件 VS SAP UI5 Semantic事件(4) UI5控制項元數據實現細節
  • 如何在SAP UI5應用裡添加使用攝像頭拍照的功能
    Jerry以前還在SAP成都研究院CRM Fiori應用開發團隊工作時,曾經寫過一個SAP UI5框架代碼的學習教程:Jerry的UI5框架代碼自學教程,裡面有兩篇文章,詳細介紹了SAP UI5 XML視圖運行時的渲染原理:Why my formatter does not work?
  • SAP系統和微信集成的系列教程之四:如何將SAP C4C主數據變化推送給...
    這個系列的前一篇文章,微信用戶關注公眾號之後,自動在SAP C4C系統創建客戶主數據,我們已經實現了這樣一個場景:微信用戶關注公眾號之後,在SAP Cloud for Customer(以下簡稱C4C)系統裡自動創建一個客戶主數據,並把該數據的Last Name欄位設置成關注者的Wechat id.
  • SAP Basis管理員常用事務代碼Tcode
    賽銳信息、sap代理商、sap服務商、sap系統、SAP ERP,SAP ERP系統、sap實施公司關鍵字: SAP BASIS、SAP事務代碼、SAP 運維、 SAP系統監控、SAP 權限管理、SAP 帳號審計, SAP License 審計、SAP 審計報告1 系統監視1.1 進程監視SM66/SM50 進程查看 : 管理員需全天監看系統的進程
  • SAP UI5和Angular的函數防抖(Debounce)和函數節流(Throttle)實現原理介紹
    因此通過本文把自己最近所學總結一下,記錄下SAP UI5和Angular裡如何使用函數防抖(Debounce)和函數節流(Throttle)來避免短時間內觸發高頻次函數調用的情況出現。為了便於講解,Jerry做了一個只包含一個Input控制項的SAP UI5頁面。
  • SAP系統和微信集成的系列教程之二:如何通過微信公眾號消費API
    作為學習的第一步,我們首先學習如何在微信公眾號調用普通的API,而非SAP C4C OData API.假設這樣一個簡單的場景:用戶關注微信公眾號之後,通過微信app給公眾號發送一些文字信息。公眾號收到這些文字信息,會轉發給我們在本系列第一篇文章 微信開發環境的搭建 裡提到的微信消息伺服器。
  • 使用SAP Cloud Application Programming模型開發OData的一個實際...
    SAP官網上給出了定義:一套由開發語言,開發工具和庫有機集成的框架,提供了一種高效,快捷,全棧式的企業級服務和應用開發手段。CAP包含一套開發最佳實踐,讓開發者能夠專注於應用內具體業務邏輯的開發,而無需分心將精力花在重複的底層基礎設施功能的實現上去。
  • Jerry在2020 SAP全球技術大會的分享:SAP Spartacus技術介紹的文字版
    同Accelerator只有原始碼級別的修改這一單一的擴展方式相比,Spartacus實現擴展性的手段更加多元化。(1) Spartacus的模塊之一,ConfigModule,將業務邏輯和頁面布局以及樣式,通過配置的方式暴露出來。二次開發人員通過調整配置,可以更改Spartacus默認的行為和頁面布局以及樣式。
  • sap「綻漾」矽膠彩片全國首創、新品上市
    5月26日, sap隱形眼鏡新品—「綻漾」矽水凝膠彩色隱形眼鏡發布會,在眾所矚目下,於寶島眼鏡北京百貨店夢幻登場。現場時尚媒體、潮人嘉賓對期待已久的「綻漾」愛不釋手,現場試戴火熱,如同「綻漾」系列訴求的,讓每位都市儷人都沉醉在綻放、幻漾的世界裡!
  • 在SAP分析雲裡根據業務數據繪製詞雲(Word Cloud)
    比如Jerry在文章 SAP Analytics Cloud和SAP Cloud for Customer的集成裡提到,最近我們做的一個項目,通過微信小程序收集用戶和SAP Conversation AI的聊天記錄,需要使用詞雲技術顯示出這些聊天記錄裡的關鍵詞。
  • SAP ABAP應用伺服器的HTTP響應狀態碼(Status Code)
    通過排查,最後我們確認這個問題和我們調用API的代碼無關,於是給Azure報了一個bug:在分析定位問題時,不由得讓我懷念起以前在ABAP On-Premise上做開發的一個便利之處——大多數問題都可以通過在ABAP應用伺服器端調試來找到根源。
  • SAPUI5UI開發組件
    sap.ui.define([ "sap/ui/thirdparty/jquery", "sap/ui/core/mvc/Controller"], function (jQuery,Controller) { "use strict"; return Controller.extend
  • 2019年SAP(中國)教育培訓部課程培訓計劃!
    B: 課程內容查詢及報名:https://training.sap.com(請務必先選擇國家和語言)C:按需定製培訓:如果您需要的課程沒有出現在下面的表中,或者時間不匹配,您可以聯繫培訓部,按需定製課程;D:考試安排:上海和北京地區,每隔周周五在SAP培訓中心舉行考試(如遇節假日則將順延),其他省份可以持有效考試券預約 VUE考試。
  • 關於SAP的日期和時間
    【IT168 技術文章】    1.日期類型(D,Date)    在sap裡Date類型通過隱含的轉換函數變為CHARACTER*8.    Elementary data type = D 內部長度和 輸出長度都等於8    System data type = DATS 內部長度 = 8 輸出長度 = 10    所有的日期類型在sap裡都會通過轉換函數存為 'YYYYMMDD'格式.
  • SAP ABAP和Java裡的弱引用(WeakReference)和軟引用(SoftReference)
    下圖這個CRM增強工具Application Enhancement Tool(簡稱AET)工廠類的方法GGET_DATA_TYPE_HANDLER, 根據兩個輸入參數,欄位數據類型和欄位行為類型,返回對應的處理器實例(handler). 這些處理器實例化時需要從若干張資料庫表裡讀取數據並保存在內存裡,因此初始化過程需要花費一定的時間。
  • 【SAP在線課堂】SAP軟體為整個企業帶來的全新用戶體驗SAP Fiori!
    今天,讓我們在SAP金牌講師郭之嘉老師的帶領下,共同學習SAP軟體為整個企業帶來的全新用戶體驗SAP Fiori ! 實施和培訓經驗。如果您希望深入學習SAP Fiori課程,SAP(中國)教育培訓部近期安排以下相關課程,供您選擇。如需了解更多SAP官方課程信息,請點擊「閱讀原文」了解更多。如您有更多教育培訓需求,請聯繫 SAP(中國)教育培訓部。
  • 【課表】SAP官方培訓課程通訊!
    尊敬的SAP客戶及合作夥伴,數字經濟大潮下,知識獲取已經全面進入數位化學習時代。
  • SAP系統和微信集成的系列教程之九:如何將微信用戶發送給微信公眾...
    (4) 如何將SAP C4C主數據變化推送給微信公眾號(5) 如何將SAP UI5應用嵌入到微信公眾號菜單中(6) 如何通過OAuth2獲取微信用戶信息並顯示在SAP UI5應用中(7) 使用Redis存儲微信用戶和公眾號的對話記錄(8) 100行代碼在微信公眾號裡集成地圖搜索功能(9) 如何將微信用戶發送到微信公眾號的消息保存到
  • 初品SAP Leonardo ML之味
    關注SAP最新潮流動向的大概都知道SAP推出了全新的SAP Leonardo平臺,不是原來那個僅僅包括物聯網的老Leonardo,而是囊括大數據,物聯網,區塊鏈和機器學習的新平臺。沒錯,今天要來玩耍一下的就是機器學習(Machine Learning),標題中的那個ML是簡稱來的,嘿嘿。