salesforce lightning零基礎學習(十六) 公用元件之 獲取欄位label資訊
我們做的專案好多都是多語言的專案,針對不同國家需要展示不同的語言的標題。我們在classic中的VF page可謂是得心應手,因為系統中已經封裝好了我們可以直接在VF獲取label/api name等方法。但是我們在lightning aura中開發卻發現這個常用的功能並沒有包含,好吧,既然沒有現成可用的那我們就要有workaround的方式去後臺獲取。此篇主要封裝好元件去實現獲取某個object或者某些object相關欄位的label。
那我們來開始進行這個元件的開發,開發以前我們需要先思考一下,元件化的東西,傳參應該是什麼,返回應該是什麼,應該實現哪些功能解決哪些痛點。如何用到更好的優化。本人思考可能並不特別的完全,感興趣的可以進行優化。
1. object 的API name應該為必填項。 這裡應該實現可以同時獲取多個表的欄位的label資訊,我們畫component時,很可能需要獲取當前的物件,父物件以及相關的子物件的欄位的label,所以此處傳參應該能做到傳遞list而不是單一的object
2. object對應的指定的field的api name列表,此項應該為可選項,非必填。我們都知道aura開發現在很慢,而且我們在前臺獲取label時,可能一個object有上百個欄位,但是我們在頁面只需要某幾個欄位的label的資訊,如果全部查出來放在前臺特別影響view state,所以我們此處應該支援可以通過指定的一些欄位進行查詢。因為object傳參是list,所以此引數應該為Map<String,List<String>>方式。
3. 返回型別應該為 Map<String,Map<String,String>>型別,外層的key是objectAPIName,內層的map的key是fieldAPIName,內層的map的value為我們需要的field label
OK,上面的已經梳理出來,那幹就完了。
一. 公用元件搭建
FieldLabelServiceController.cls 用於後臺搭建查詢指定的obj / field的value -> label資訊
1 public with sharing class FieldLabelServiceController { 2 /* 3 * @param objApiNameList : object API name list. eg:['Account','Contact'] 4 * @param objApiName2FieldsMap: object API name 2 fields map. eg:{'Account':['Name','Type'],'Contact':['LastName','Phone']} 5 * @return object API name 2 map of field API name -> label name. eg:{'Account':{'Type':'型別'},'Contact':{'LastName':'姓'}} 6 */ 7 @AuraEnabled 8 public static Map<String,Map<String,String>> getFieldLabelService(List<String> objApiNameList,Map<String,List<String>> objApiName2FieldsMap) { 9 // key: object API name ; value : (Map: key:field API name, value: field label)10 Map<String,Map<String,String>> object2FieldLabelMap = new Map<String,Map<String,String>>();11 //get all sobject sObjectType map12 Map<String,sObjectType> objName2ObjTypeMap = Schema.getGlobalDescribe();13 for(String objApiName : objApiNameList) {14 15 //1. get specific object sObjectType16 sObjectType objType = objName2ObjTypeMap.get(objApiName);17 //2. get all of the fields map via specific object18 Map<String,Schema.SObjectField> fieldsMap = objType.getDescribe().fields.getMap();19 20 //3. check if retrieve specific field list or all the fields mapping via object21 Set<String> retrieveFieldList = new Set<String>();22 if(objApiName2FieldsMap != null && objApiName2FieldsMap.containsKey(objApiName)) {23 retrieveFieldList = new Set<String>(objApiName2FieldsMap.get(objApiName));24 }25 26 Map<String,String> fieldApiName2FieldLabelMap = new Map<String,String>();27 //4. get all / specific field api name -> label name mapping28 for(String fieldApiName : fieldsMap.keySet()){29 if(retrieveFieldList.size() > 0 && !retrieveFieldList.contains(String.valueOf(fieldsMap.get(fieldApiName)))) {30 continue;31 }32 33 String label = fieldsMap.get(fieldApiName).getDescribe().getLabel();34 fieldApiName2FieldLabelMap.put(String.valueOf(fieldsMap.get(fieldApiName)), label == null ? fieldApiName : label);35 }36 37 object2FieldLabelMap.put(objApiName, fieldApiName2FieldLabelMap);38 }39 return object2FieldLabelMap;40 }41 }
FieldLabelService.cmp:用於封裝共用方法
1 <aura:component access="global" description="Field label service" controller="FieldLabelServiceController">2 <aura:method access="global" name="getFieldLabel" action="{!c.getFieldLabelAction}">3 <aura:attribute type="List" name="objectAPINameList" required="true" description="object list to retrieve field label" />4 <aura:attribute type="Map" name="objectFieldAPINameMap" description="specific fields need to retrieve via object api name"/>5 <aura:attribute type="Function" name="callback" required="true" />6 </aura:method>7 </aura:component>
FieldLabelServiceController.js:用於封裝對應的controller js方法,呼叫後臺獲取結果
1 ({ 2 getFieldLabelAction : function(component, event, helper) { 3 const params = event.getParam('arguments'); 4 const action = component.get('c.getFieldLabelService'); 5 action.setParams({ 6 "objApiNameList" : params.objectAPINameList, 7 "objApiName2FieldsMap":params.objectFieldAPINameMap 8 }); 9 action.setCallback(this, function(response) {10 const state = response.getState();11 if (state === 'SUCCESS') {12 params.callback(response.getReturnValue());13 } else if (state === 'ERROR') {14 const errors = response.getError();15 if (errors) {16 console.error(JSON.stringify(errors));17 } else {18 console.error('Unknown error');19 }20 }21 });22 23 $A.enqueueAction(action);24 }25 })
至此元件封裝完成,下面是呼叫部分。呼叫部分沒有UI,感興趣的自行畫UI。
二. 公用元件測試
FieldLabelTestComponent:用於引入公用元件,並且初始化獲取Account/Contact的field label。
<aura:component implements="flexipage:availableForAllPageTypes"> <aura:handler name="init" value="{!this}" action="{!c.doInit}"/> <aura:attribute name="accountFieldLabelMap" type="Map"/> <aura:attribute name="contactFieldLabelMap" type="Map"/> <c:FieldLabelService aura:id="service"/></aura:component>
FieldLabelTestComponentController.js:用於後臺呼叫公用元件的方法,傳值,針對response進行解析獲取自己需要的內容。demo中針對account只獲取name以及type的值,對contact獲取所有欄位的label值。
1 ({ 2 doInit : function(component, event, helper) { 3 const service = component.find('service'); 4 let objectAPINameList = ['Account','Contact']; 5 let objectFieldAPINameMap = {'Account':['Name','Type']}; 6 service.getFieldLabel(objectAPINameList,objectFieldAPINameMap,function(result) { 7 console.log(JSON.stringify(result)); 8 component.set('v.accountFieldLabelMap',result['Account']); 9 component.set('v.contactFieldLabelMap',result['Contact']);10 console.log(JSON.stringify(result['Account']));11 console.log(JSON.stringify(result.Account));12 });13 }14 })
結果展示:針對account只獲取了指定的欄位的label,Contact獲取了所有的label資訊。可以使用[]方式或者.的方式獲取詳細內容。
總結:篇中簡單的介紹了針對aura情況下獲取field label的公用元件的實現。篇中有錯誤的地方歡迎指出,有不懂的歡迎留言,有可以優化的地方歡迎交流並且鼓勵優化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69949357/viewspace-2667219/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- salesforce零基礎學習(九十六)Platform Event淺談SalesforcePlatform
- salesforce零基礎學習(一百零九)Lightning Login啟用以及配置Salesforce
- salesforce零基礎學習(一百零四)Salesforce OptimizerSalesforce
- salesforce零基礎學習(一百零八)MFASalesforce
- salesforce lightning零基礎學習(十七) 實現上傳 Excel解析其內容SalesforceExcel
- salesforce零基礎學習(一百零二)Limitation篇之 CPU LimitSalesforceMIT
- Salesforce LWC學習(十九) 針對 lightning-input-field的label值重寫Salesforce
- salesforce零基礎學習(一百一十三)Trigger中獲取IP地址的過程Salesforce
- salesforce零基礎學習(一百一十一)custom metadata type資料獲取方式更新Salesforce
- salesforce零基礎學習(一百零五)Change Data CaptureSalesforceAPT
- Oracle獲取所有表名資訊和獲取指定表名欄位資訊Oracle
- sql2005 獲取表欄位資訊和檢視欄位資訊SQL
- salesforce零基礎學習(九十九)Salesforce Data Skew(資料傾斜)Salesforce
- salesforce零基礎學習(九十八)Type淺談Salesforce
- salesforce零基礎學習(九十七)Big ObjectSalesforceObject
- salesforce零基礎學習(一百)Mobile Device TrackingSalesforcedev
- salesforce零基礎學習(一百二十六) Picklist Value Set 優缺點和使用探討Salesforce
- Salesforce 整合篇零基礎學習(一)Connected AppSalesforceAPP
- salesforce零基礎學習(一百三十三)ListView的button思考SalesforceView
- salesforce零基礎學習(九十六)專案中的零碎知識點小總結(四)Salesforce
- salesforce零基礎學習(一百二十四)Postman 使用SalesforcePostman
- 獲取sql server 2008表欄位資訊SQLServer
- salesforce零基礎學習(一百三十二)Flow新功能: Custom ErrorSalesforceError
- 獲取SqlServer 2005中欄位的備註資訊SQLServer
- salesforce零基礎學習(九十九)Git 在salesforce專案中的應用(vs code篇)SalesforceGit
- salesforce零基礎學習(一百一十五)記一個有趣的bugSalesforce
- Salesforce LWC學習(二十三) Lightning Message Service 淺談Salesforce
- 零基礎學習 Python 之字串Python字串
- swift基礎學習(十六)Swift
- 從Sql server 2008獲取表欄位屬性資訊,註釋資訊SQLServer
- salesforce零基礎學習(一百三十一)Validation 一次的bypass設計Salesforce
- salesforce零基礎學習(一百二十三)Transaction Security 淺入淺出Salesforce
- lambda方法引用獲取欄位屬性
- 零基礎學習 Python 之檔案Python
- 零基礎學習 Python 之閉包Python
- 零基礎學習 Python 之函式Python函式
- salesforce零基礎學習(一百二十七)Custom Metadata Type 篇二Salesforce
- Oracle 元件資訊獲取途徑整理Oracle元件