天天看點

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

今天是農曆鼠年大年初五,本文是鼠年第5篇文章,也是汪子熙公衆号第204篇原創文章。

最近大家真是談蝙蝠色變呀!

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel
揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

SAP官網的ABAP Programming Model for Fiori幫助文檔裡,定義了很多注解(Annotation):

https://help.sap.com/viewer/cc0c305d2fab47bd808adcad3ca7ee9d/1709%20000/en-US/896496ecfe4f4f8b857c6d93d4489841.html

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

對于這些注解,我們可以從其字面含義和SAP幫助文檔去掌握其用法和功能。

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

以@ObjectModel.readOnly為例,施加了這個注解的CDS view字段,在對應的Fiori UI上以隻讀的方式渲染:

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

并且也不能通過程式設計的方式進行修改。

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

大家在使用這些注解的時候,有沒有想過,它們是怎麼工作的?

以@ObjectModel.readOnly為例,現在就請跟着Jerry一起,去探索它的前背景實作原理。

在Chrome開發者工具的UI5面闆裡,找到Posting Date這個控件對應的屬性,發現字段editable屬性值為false,這就是其在UI不能編輯的原因。

如果你的Chrome開發者工具沒有UI5這個标簽,請參考Jerry這篇文章,安裝Chrome for UI5的擴充:

Jerry的Fiori原創文章合集

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

既然背景模型是CDS view,那麼前台UI顯然基于Fiori Elements. 我想知道Posting Date這個控件的editable屬性是在什麼時候被設定成false的。

在SmartField.setEditable函數裡設定斷點,重新打開Fiori UI,點選Edit進入編輯模型,斷點觸發,從調用棧能看出,有代碼調用SmartField.setEditable時,傳入的參數為false.

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

那麼這個false如何計算出來的?順着目前的調用棧往外層查找,發現一個重要的函數:

AnnotationHelper.canUpdateProperty.

從函數名就能猜測出,這個函數負責計算一個控件的屬性是否允許更新(Update),工作的上下文就是注解(Annotation).

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

這個方法實作體的語義也很清楚,如果背景模型字段sap:updatable設定為false,則canUpdateProperty函數調用傳回false,導緻SmartField.setEditable以參數false去渲染Fiori UI.

我們打開OData服務的metadata,發現posting date字段對應的sap:updatable果然為false.

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

至此Fiori UI的工作原理分析完畢。我們再來看背景。我的CDS view裡隻添加了@ObjectModel.readOnly為true的注解,而非sap:updatable. 顯然,這二者存在一定的關聯關系。

在Jerry之前的文章 Jerry的CDS view自學系列 介紹過CDS view架構處理邏輯,有這麼一段代碼:

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

第839行的IF判斷,如果OBJECTMODEL.READONLY為true,則read_only屬性為X.

而read_only屬性為true,會導緻posting date字段的屬性集合内表裡,新增一條read_only為X的記錄:

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

最後,在SADL架構的屬性檢測邏輯中,一旦發現字段屬性集合内表裡存在read_only為X的屬性,則将lv_creatable和lv_updatable置為false.

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

而SADL架構計算出來的這兩個值為false的布爾變量,最後就會将sap:creatable和sap:updatable設定為false.

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

@ObjectModel.readOnly屬性的前背景工作原理的神秘面紗,至此就揭開了,然而它隻是SAP Fiori程式設計模型衆多注解的冰山一角。敬請關注Jerry後續的分享,感謝閱讀。

揭開SAP Fiori程式設計模型規範裡注解的神秘面紗 - @ObjectModel

更多閱讀

Jerry的通過CDS view + Smart Template 開發Fiori應用的blog合集

SAP Fiori應用的三種部署方式

SAP成都C4C小李探花:淺談Fiori Design Guidelines

SAP Fiori + Vue = ?

Fiori Fundamentals和SAP UI5 Web Components

30分鐘用Restful ABAP Programming模型開發一個支援增删改查的Fiori應用

SAP Fiori應用索引大全

介紹一種Fiori标準應用的增強方式

繼續閱讀