构建可重复使用的闪电组件

构建可重复使用的闪电组件 – 创建指标徽章Apex服务

创建指标徽章Apex服务

我们已经在Lightning Experience中启动并运行了组件,并连接了一个Apex控制器。现在,我们需要将组件连接到我们的自定义元数据,然后通过在Apex中添加服务并将其与我们已经编写的代码相连接来实现。

创建指标徽章服务类

  1. 点击齿轮图标(齿轮图标),然后选择开发者控制台
  2. 单击文件>新建> Apex类
  3. 命名Apex类INDICATOR_Service
  4. 将生成的代码替换为:
    public class INDICATOR_Service {
      public static List<String> getFieldsToQueryForObject(String objName){
        Set<String> targetFields = new Set<String>();
        for(Indicator_Badge__mdt i: [SELECT Related_Field__r.QualifiedApiName FROM Indicator_Badge__mdt WHERE Object__r.QualifiedApiName = :objName]){
          targetFields.add(i.Related_Field__r.QualifiedApiName);
        }
        return new List<String>(targetFields);
      }
      public static List<Indicator> getIndicatorBadgesForObject(SObject sobj){
        List<Indicator> recordIndicators = new List<Indicator>();
        for(Indicator_Badge__mdt indicator: [SELECT MasterLabel, Badge_Color__c, Comparison_Value__c, Comparison_Type__c, Badge_Icon_Name__c, Related_Field__r.QualifiedApiName FROM Indicator_Badge__mdt WHERE Object__r.QualifiedApiName = :sobj.getSObjectType().getDescribe().getName()]){
          recordIndicators.add(evaluateIndicator(indicator, sobj));
        }
        return recordIndicators;
      }
      private static Indicator evaluateIndicator(Indicator_Badge__mdt i, SObject sobj){
        Object field = sobj.get(i.Related_Field__r.QualifiedApiName);
        Boolean isEnabled = false;
        if(i.Comparison_Type__c == 'Use Boolean Value of Field'){
          isEnabled = (Boolean)field;
        } else if(i.Comparison_Type__c == 'Contains'){
          isEnabled = (String.valueOf(field)).contains(i.Comparison_Value__c);
        } else if(i.Comparison_Type__c == 'Not Blank or Null'){
          isEnabled = String.isNotBlank(String.valueOf(field));
        } else if(i.Comparison_Type__c == 'Blank or Null'){
          isEnabled = String.isBlank(String.valueOf(field));
        } else if(i.Comparison_Type__c == 'Greater or Equal'){
          isEnabled = (Decimal)field >= Decimal.valueOf(i.Comparison_Value__c);
        } else if(i.Comparison_Type__c == 'Less or Equal'){
          isEnabled = (Decimal)field <= Decimal.valueOf(i.Comparison_Value__c);
        }
        if(isEnabled){
          return new Indicator(i.Badge_Icon_Name__c, i.Badge_Color__c, i.MasterLabel);
        } else {
          return null;
        }
      }
      //inner class, creating our 'Indicator' object and attributes
      public class Indicator{
        //first, the attributes:
        @AuraEnabled
        public String icon {get; set;}
        @AuraEnabled
        public String color {get; set;}
        @AuraEnabled
        public String label {get; set;}
        //then, our object:
        public Indicator(String icon, String color, String label){
          this.icon = icon;
          this.color = color;
          this.label = label;
        }
      }
    }
  5. 单击文件>保存

代码重点:

  • INDICATOR_Service类,顾名思义,服务查询和处理指标徽章记录。它还包含一个称为Indicator的内部类,其作用类似于内存中的自定义对象。换句话说,它存在的时间只要有人正在查看记录并使用它,但是就不再存在。不要弄乱数据库!此内部类是Lightning组件使用的实际对象(因此@auraEnabled批注)。
  • getIndicatorBadgesForObject方法基于sObject类型运行针对指标徽章自定义元数据记录的查询,该查询作为参数传递。
  • getFieldsToQueryForObject方法根据在任何关联的指标徽章记录上找到的“相关字段”值,从Salesforce的特定记录中组合所需的字段。
  • evaluateIndicator方法就是魔术(又称业务逻辑!)发生的地方:它使用特定记录的值来决定是否应显示指示器徽章。

在指标控制器中添加对指标服务的访问权限

  1. 在开发人员控制台中,导航到INDICATOR_Controller Apex类。
  2. 用以下代码替换当前标记:
    public class INDICATOR_Controller {
      private static SObject sobj;
      @AuraEnabled
      public static String getSObjectLabel(String sObjName){
        String label = Schema.getGlobalDescribe().get(sObjName).getDescribe().getLabel();
        return label;
      }
      @AuraEnabled
      public static List<INDICATOR_Service.Indicator> getIndicators(String recId, String objectName){
        getSObject(recId, objectName);
        if(sobj != NULL){
          List<INDICATOR_Service.Indicator> indicators = INDICATOR_Service.getIndicatorBadgesForObject(sobj);
          return indicators;
        } else {
          return null;
        }
      }
      public static void getSObject(String recId, String objectName){
        List<String> fNames = INDICATOR_Service.getFieldsToQueryForObject(objectName);
        if(fNames.size() > 0){
          String query = 'SELECT Id,'+ String.join(fNames,',')+' FROM '+ objectName +' WHERE Id =\''+ recId +'\' LIMIT 1';
          List<SObject> results = Database.query(query);
          if(results.size() == 1){
            sobj = results[0];
          }
        }
      }
    }
  3. 单击文件>保存

代码重点:

  • INDICATOR_Controller中@AuraEnabled方法为特定记录协调指标对象(由INDICATOR_Service定义在内存中的对象)的获取和返回。
  • getSObject方法使用动态查询来获取记录的相关字段。

你可能也会喜欢...