构建可重复使用的闪电组件 – 使用闪电数据服务处理记录级更改

使用闪电数据服务处理记录级更改

添加了IndicatorBadges组件后,ZBS Lightning页面看起来很棒,但是我们仍然需要提高其性能以使其匹配。让我们将Lightning Data Service添加到我们的IndicatorBadges组件中,看看它如何快速响应影响记录级数据的更改。

添加闪电数据服务

  1. 在开发者控制台中,将以下代码添加到IndicatorBadges组件标记中的一行下面aura:handler
    <force:recordData recordId="{!v.recordId}" layoutType="FULL" recordUpdated="{!c.doInit}"/>
  2. 完成的组件现在应如下所示:
    <aura:component implements="force:hasRecordId,force:hasSObjectName,flexipage:availableForRecordHome" controller="INDICATOR_Controller" access="public">
      <aura:attribute name="badgeList" type="object[]"/>
      <aura:attribute name="objLabel" type="String" />
      <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
      <force:recordData recordId="{!v.recordId}" layoutType="FULL" recordUpdated="{!c.doInit}"/>
      <lightning:card iconName="standard:coaching" title="{! v.objLabel +' Indicators'}" class="slds-text-title_caps">
        <div class="slds-p-left_medium slds-p-right_medium">
          <lightning:layout verticalAlign="stretch" horizontalAlign="start" multipleRows="true" pullToBoundary="small">
            <aura:iteration items="{!v.badgeList}" var="thisBadge" aura:id="theList">
              <lightning:layoutItem size="2" padding="horizontal-small">
                <c:IndicatorBadge badge="{!thisBadge}"/>
              </lightning:layoutItem>
            </aura:iteration>
          </lightning:layout>
        </div>
      </lightning:card>
    </aura:component>
  3. 单击文件>保存
  4. 在Salesforce中,单击“显示”选项卡,然后从列表中选择“控制台点日志倒数”。记下显示指示器组件中显示的标志。
  5. 编辑“活动联合组织”字段,使其值为3
  6. 单击保存,然后刷新您的浏览器。

注意到我们的记录有任何变化吗?我们的组件收集了总有效联合发布中的更改,并显示一条通知,表明Console Dot Log Countdown是观众的最爱。(时间也到了!)

代码重点:

  • 我们使用Lightning Data Service(带有force:recordData)来使我们的组件知道记录的更改。我们利用该layoutType="FULL"属性来确保我们正在侦听用户可以与之交互的所有字段,并doInit在发生任何更改时触发我们的功能。
  • 因为我们优化了控制器和辅助程序,使其仅针对未设置的值执行对服务器的调用,所以当我们基于记录级更改触发doInit()时,我们不再再次查询sObject标签。我们只是在执行刷新徽章的逻辑。

ew!给自己一个心理高五。通过使用“自定义元数据”,“ Apex”和“闪电”组件进行构建,您已使ZBS能够使其Salesforce组织更有效,更具适应性,并且更加有趣。谁又不喜欢他们的一天呢?现在去徽章。所有。的。东西!

构建可重复使用的闪电组件 – 使用闪电数据服务处理记录级更改

使用闪电数据服务处理记录级更改

添加了IndicatorBadges组件后,ZBS Lightning页面看起来很棒,但是我们仍然需要提高其性能以使其匹配。让我们将Lightning Data Service添加到我们的IndicatorBadges组件中,看看它如何快速响应影响记录级数据的更改。

添加闪电数据服务

  1. 在开发者控制台中,将以下代码添加到IndicatorBadges组件标记中的一行下面aura:handler
    <force:recordData recordId="{!v.recordId}" layoutType="FULL" recordUpdated="{!c.doInit}"/>
  2. 完成的组件现在应如下所示:
    <aura:component implements="force:hasRecordId,force:hasSObjectName,flexipage:availableForRecordHome" controller="INDICATOR_Controller" access="public">
      <aura:attribute name="badgeList" type="object[]"/>
      <aura:attribute name="objLabel" type="String" />
      <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
      <force:recordData recordId="{!v.recordId}" layoutType="FULL" recordUpdated="{!c.doInit}"/>
      <lightning:card iconName="standard:coaching" title="{! v.objLabel +' Indicators'}" class="slds-text-title_caps">
        <div class="slds-p-left_medium slds-p-right_medium">
          <lightning:layout verticalAlign="stretch" horizontalAlign="start" multipleRows="true" pullToBoundary="small">
            <aura:iteration items="{!v.badgeList}" var="thisBadge" aura:id="theList">
              <lightning:layoutItem size="2" padding="horizontal-small">
                <c:IndicatorBadge badge="{!thisBadge}"/>
              </lightning:layoutItem>
            </aura:iteration>
          </lightning:layout>
        </div>
      </lightning:card>
    </aura:component>
  3. 单击文件>保存
  4. 在Salesforce中,单击“显示”选项卡,然后从列表中选择“控制台点日志倒数”。记下显示指示器组件中显示的标志。
  5. 编辑“活动联合组织”字段,使其值为3
  6. 单击保存,然后刷新您的浏览器。

注意到我们的记录有任何变化吗?我们的组件收集了总有效联合发布中的更改,并显示一条通知,表明Console Dot Log Countdown是观众的最爱。(时间也到了!)

代码重点:

  • 我们使用Lightning Data Service(带有force:recordData)来使我们的组件知道记录的更改。我们利用该layoutType="FULL"属性来确保我们正在侦听用户可以与之交互的所有字段,并doInit在发生任何更改时触发我们的功能。
  • 因为我们优化了控制器和辅助程序,使其仅针对未设置的值执行对服务器的调用,所以当我们基于记录级更改触发doInit()时,我们不再再次查询sObject标签。我们只是在执行刷新徽章的逻辑。

ew!给自己一个心理高五。通过使用“自定义元数据”,“ Apex”和“闪电”组件进行构建,您已使ZBS能够使其Salesforce组织更有效,更具适应性,并且更加有趣。谁又不喜欢他们的一天呢?现在去徽章。所有。的。东西!

构建可重复使用的闪电组件 – 创建指示器徽章闪电组件

创建指示器徽章闪电组件

现在,我们已经为服务器上的指标徽章奠定了基础,让我们开始有趣的部分:为ZBS用户显示指标。

创建一个徽章组件

我们已经建立了一个外部组件来保存指标,但是仍然需要用一些东西来填充它。让我们构建一个Lightning组件,用于显示各个指示器标志。

    1. 在开发人员控制台中,选择“文件”>“新建”>“闪电组件”
    2. 命名组件IndicatorBadge,然后单击提交
    3. 用以下代码替换生成的代码:
      <aura:component >
        <aura:attribute name="badge" type="Object" />
        <lightning:icon iconName="{!v.badge.icon}" class="{! 'slds-box slds-box_x-small slds-align_absolute-center slds-size__1-of-1 '+v.badge.color}" alternativeText="{!v.badge.label}" />
      </aura:component>
    4. 单击右侧组件面板中的“样式”,然后用以下代码替换内容:
      .THIS.DeepPink {
        background-color: deeppink;
      }
      .THIS.DeepSkyBlue{
        background-color: deepskyblue;
      }
      .THIS.LimeGreen{
        background-color: limegreen;
      }
      .THIS.Gold{
        background-color: gold;
      }
      .THIS.Red{
        background-color: red;
      }
      .THIS.RosyBrown{
        background-color: rosybrown;
      }
      .THIS.Tomato{
        background-color: tomato;
      }
      .THIS.Turquoise{
        background-color: darkturquoise;
      }
      .THIS.Violet{
        background-color: violet;
      }
      .THIS.YellowGreen{
        background-color: yellowGreen;
      }
      .THIS{
        height: 3rem;
        width: 3rem;
      }

代码重点:

  • IndicatorBadge.css标记允许我们将指标的背景颜色与自定义元数据类型的“徽章颜色”字段的选择列表值进行匹配。它还使用一些相对大小来使我们的徽章保持方形。
  • 所述IndicatorBadge使用lightning:icon碱组件来创建单独的图标的徽章。该组件可让您轻松触碰所有的Lightning Design System图标。我们正在将指标徽章记录的名称(使用自定义元数据记录中的MasterLabel字段值)alternativeText传递到属性中,以向可能正在使用辅助技术的ZBS用户提供一致的信息。

修改指标徽章标记并优化逻辑

我们需要更新我们的IndicatorBadges组件以嵌入我们的新IndicatorBadge组件,并确保我们的控制器和助手已经过优化以处理新功能。

  1. 导航到IndicatorBadges组件。替换<!--Indicator Badge here-->为以下代码:
    <c:IndicatorBadge badge="{!thisBadge}" />
  2. 现在,我们也需要更新控制器和辅助逻辑。
  3. 单击右侧组件面板中的“ CONTROLLER”,然后将内容替换为以下代码:
    ({
      doInit : function(component, event, helper) {
        var recId = component.get("v.recordId");
        var sObj = component.get("v.sObjectName");
        if(sObj){
          helper.getLabelForRecord(component, sObj);
          helper.getBadgesForRecord(component, recId, sObj);
        }
      },
      //future code here
    })
  4. 单击右侧组件面板中的HELPER并替换//future code here为以下代码:
     getBadgesForRecord : function(component, recId, sObj) {
        var action = component.get("c.getIndicators");
        action.setParams({
          recId : recId,
          objectName : sObj
        });
        action.setCallback(this, function(response){
          var state = response.getState();
          if(state === "SUCCESS"){
            var badges = response.getReturnValue();
            component.set("v.badgeList", badges);
          } else if (state === "ERROR"){
            console.log('Error: ' + JSON.stringify(response.error));
          } else {
            console.log('Unknown problem, state: ' + state + ', error: ' + JSON.stringify(response.error));
          }
        });
        $A.enqueueAction(action);
      },
      //future code here
  5. 我们还需要更新getLabelForRecord方法以响应控制器中的更改。用以下代码替换现有的方法标记:
     getLabelForRecord : function(component, sObj){
        if(!component.get("v.objLabel")){
          var action = component.get("c.getSObjectLabel");
          action.setParams({
            sObjName : sObj
          });
          action.setCallback(this, function(response){
            var state = response.getState();
            if(state === "SUCCESS"){
              var label = response.getReturnValue();
              component.set("v.objLabel", label);
            } else if(state === "ERROR"){
              console.log('Error: ' + JSON.stringify(response.error));
            } else {
              console.log('Unknown problem, state: '+ state + ', error: ' + JSON.stringify(response.error));
            }
          });
          $A.enqueueAction(action);
        }
      },
  6. 您完成的帮助程序现在应如下所示:
    ({
      getLabelForRecord : function(component, sObj){
        if(!component.get("v.objLabel")){
          var action = component.get("c.getSObjectLabel");
          action.setParams({
            sObjName : sObj
          });
          action.setCallback(this, function(response){
            var state = response.getState();
            if(state === "SUCCESS"){
              var label = response.getReturnValue();
              component.set("v.objLabel", label);
            } else if(state === "ERROR"){
              console.log('Error: ' + JSON.stringify(response.error));
            } else {
              console.log('Unknown problem, state: '+ state + ', error: ' + JSON.stringify(response.error));
            }
          });
          $A.enqueueAction(action);
        }
      },
      getBadgesForRecord : function(component, recId, sObj) {
        var action = component.get("c.getIndicators");
        action.setParams({
          recId : recId,
          objectName : sObj
        });
        action.setCallback(this, function(response){
          var state = response.getState();
          if(state === "SUCCESS"){
            var badges = response.getReturnValue();
            component.set("v.badgeList", badges);
          } else if (state === "ERROR"){
            console.log('Error: ' + JSON.stringify(response.error));
          } else {
            console.log('Unknown problem, state: ' + state + ', error: ' + JSON.stringify(response.error));
          }
        });
        $A.enqueueAction(action);
      },
      //future code here
    })
  7. 单击文件>全部保存
  8. 在Salesforce中,单击“帐户”选项卡,然后选择“ API First Communications”记录。我们的帐户指标变得更加令人兴奋,不是吗?

    API First Communications帐户详细信息

  9. 单击“联系人”选项卡,然后从“最近查看的联系人”相关列表中选择Gerta Pickles,然后刷新浏览器。哇!现在我们到了某个地方。

    Gerta Pickles的联系方式

代码重点:

  • doInit我们的控制文件的方法正在打电话给两个不同的功能:getLabelForRecordgetBadgesForRecord。仅通过利用帮助程序类在Lightning中支持这种级别的复杂性(即,同步调用多个函数)。
  • 我们正在对服务器进行两次调用(而不是将所有操作组合到一个调用中),以使组件的标题标记正确显示,即使记录中没有要显示的指标也是如此。
  • 为了不对服务器进行不必要的调用,我们修改了getLabelForRecordhelper方法,仅在objLabel尚未使用有效数据填充属性时才调用服务器。
  • 我们使用aura:iteration,并将整个Indicator对象传递给我们的IndicatorBadge组件,而不是分解单个属性。因为我们将@AuraEnabled标记添加到了指标内部类的属性中,所以我们可以在组件内部使用点表示法并引用这些值。

指示器徽章所有事情!

我们已将组件添加到“客户”和“联系人”记录页面上。让我们真正地动态起来,并将组件添加到ZBSLightning应用程序的所有记录页面中。因为有了徽章,一切都会变得更好。

  1. 在Salesforce中,从应用启动器(应用启动器图标)中找到并选择ZBSLightning,然后单击“显示”选项卡。从列表中选择“不为空”。(如果“最近查看”列表中没有记录,请更改为“所有节目”列表。)
  2. 单击齿轮图标(齿轮图标),然后选择“编辑页面”以打开Lightning App Builder。
  3. IndicatorBadges自定义组件从“闪电组件”列表拖到页面上,并将其放在右列中。
  4. 点击保存
  5. 点击激活
  6. 点击分配为组织默认值,然后单击下一步,然后保存
  7. 单击背部以退出Lightning App Builder并返回到记录主页。
    不为空显示详细信息页面只需添加我们的组件,看看我们从该记录中发现了什么!这个节目有很多事情:这是ZBS Audience Favorite(我们决定在设置“ Audience Favorite”自定义元数据记录时显示为番茄色温度计/ custom97 SLDS图标),还有Vlog(我们将其设置为紫罗兰色电视)。而且我们可以立即看到这一点,而不必深入任何领域。让我们继续加油ZBS。
  8. 在Salesforce中,单击“联合组织”选项卡。从列表中选择任何记录。(如果“最近查看”列表中没有记录,请更改为“所有联合组织”列表。)
  9. 单击齿轮图标(齿轮图标),然后选择“编辑页面”以打开Lightning App Builder。
  10. IndicatorBadges自定义组件从“闪电组件”列表拖到页面上,并将其放在右列中。
  11. 点击保存
  12. 点击激活
  13. 点击分配为组织默认值,然后单击下一步,然后保存
  14. 单击背部以退出Lightning App Builder并返回到记录主页。

注意到任何指标吗?单击详细信息选项卡(如果尚未激活该选项卡),然后查看该IsActive字段的值。如果未选中该框,则我们的组件应该为空。在此对象上下文中,我们看到我们的组件不仅传达有关记录的复杂细节。它还可以帮助繁忙的ZBS用户注意到简单但关键的数据质量问题。

但是,如果用户更改了记录中的某些数据并且我们需要显示不同的指标,那么在当前状态下,我们的组件会发生什么变化?(提示:没有。)让我们在下一步中修复它。

构建可重复使用的闪电组件 – 创建指示器徽章闪电组件

创建指示器徽章闪电组件

现在,我们已经为服务器上的指标徽章奠定了基础,让我们开始有趣的部分:为ZBS用户显示指标。

创建一个徽章组件

我们已经建立了一个外部组件来保存指标,但是仍然需要用一些东西来填充它。让我们构建一个Lightning组件,用于显示各个指示器标志。

    1. 在开发人员控制台中,选择“文件”>“新建”>“闪电组件”
    2. 命名组件IndicatorBadge,然后单击提交
    3. 用以下代码替换生成的代码:
      <aura:component >
        <aura:attribute name="badge" type="Object" />
        <lightning:icon iconName="{!v.badge.icon}" class="{! 'slds-box slds-box_x-small slds-align_absolute-center slds-size__1-of-1 '+v.badge.color}" alternativeText="{!v.badge.label}" />
      </aura:component>
    4. 单击右侧组件面板中的“样式”,然后用以下代码替换内容:
      .THIS.DeepPink {
        background-color: deeppink;
      }
      .THIS.DeepSkyBlue{
        background-color: deepskyblue;
      }
      .THIS.LimeGreen{
        background-color: limegreen;
      }
      .THIS.Gold{
        background-color: gold;
      }
      .THIS.Red{
        background-color: red;
      }
      .THIS.RosyBrown{
        background-color: rosybrown;
      }
      .THIS.Tomato{
        background-color: tomato;
      }
      .THIS.Turquoise{
        background-color: darkturquoise;
      }
      .THIS.Violet{
        background-color: violet;
      }
      .THIS.YellowGreen{
        background-color: yellowGreen;
      }
      .THIS{
        height: 3rem;
        width: 3rem;
      }

代码重点:

  • IndicatorBadge.css标记允许我们将指标的背景颜色与自定义元数据类型的“徽章颜色”字段的选择列表值进行匹配。它还使用一些相对大小来使我们的徽章保持方形。
  • 所述IndicatorBadge使用lightning:icon碱组件来创建单独的图标的徽章。该组件可让您轻松触碰所有的Lightning Design System图标。我们正在将指标徽章记录的名称(使用自定义元数据记录中的MasterLabel字段值)alternativeText传递到属性中,以向可能正在使用辅助技术的ZBS用户提供一致的信息。

修改指标徽章标记并优化逻辑

我们需要更新我们的IndicatorBadges组件以嵌入我们的新IndicatorBadge组件,并确保我们的控制器和助手已经过优化以处理新功能。

  1. 导航到IndicatorBadges组件。替换<!--Indicator Badge here-->为以下代码:
    <c:IndicatorBadge badge="{!thisBadge}" />
  2. 现在,我们也需要更新控制器和辅助逻辑。
  3. 单击右侧组件面板中的“ CONTROLLER”,然后将内容替换为以下代码:
    ({
      doInit : function(component, event, helper) {
        var recId = component.get("v.recordId");
        var sObj = component.get("v.sObjectName");
        if(sObj){
          helper.getLabelForRecord(component, sObj);
          helper.getBadgesForRecord(component, recId, sObj);
        }
      },
      //future code here
    })
  4. 单击右侧组件面板中的HELPER并替换//future code here为以下代码:
     getBadgesForRecord : function(component, recId, sObj) {
        var action = component.get("c.getIndicators");
        action.setParams({
          recId : recId,
          objectName : sObj
        });
        action.setCallback(this, function(response){
          var state = response.getState();
          if(state === "SUCCESS"){
            var badges = response.getReturnValue();
            component.set("v.badgeList", badges);
          } else if (state === "ERROR"){
            console.log('Error: ' + JSON.stringify(response.error));
          } else {
            console.log('Unknown problem, state: ' + state + ', error: ' + JSON.stringify(response.error));
          }
        });
        $A.enqueueAction(action);
      },
      //future code here
  5. 我们还需要更新getLabelForRecord方法以响应控制器中的更改。用以下代码替换现有的方法标记:
     getLabelForRecord : function(component, sObj){
        if(!component.get("v.objLabel")){
          var action = component.get("c.getSObjectLabel");
          action.setParams({
            sObjName : sObj
          });
          action.setCallback(this, function(response){
            var state = response.getState();
            if(state === "SUCCESS"){
              var label = response.getReturnValue();
              component.set("v.objLabel", label);
            } else if(state === "ERROR"){
              console.log('Error: ' + JSON.stringify(response.error));
            } else {
              console.log('Unknown problem, state: '+ state + ', error: ' + JSON.stringify(response.error));
            }
          });
          $A.enqueueAction(action);
        }
      },
  6. 您完成的帮助程序现在应如下所示:
    ({
      getLabelForRecord : function(component, sObj){
        if(!component.get("v.objLabel")){
          var action = component.get("c.getSObjectLabel");
          action.setParams({
            sObjName : sObj
          });
          action.setCallback(this, function(response){
            var state = response.getState();
            if(state === "SUCCESS"){
              var label = response.getReturnValue();
              component.set("v.objLabel", label);
            } else if(state === "ERROR"){
              console.log('Error: ' + JSON.stringify(response.error));
            } else {
              console.log('Unknown problem, state: '+ state + ', error: ' + JSON.stringify(response.error));
            }
          });
          $A.enqueueAction(action);
        }
      },
      getBadgesForRecord : function(component, recId, sObj) {
        var action = component.get("c.getIndicators");
        action.setParams({
          recId : recId,
          objectName : sObj
        });
        action.setCallback(this, function(response){
          var state = response.getState();
          if(state === "SUCCESS"){
            var badges = response.getReturnValue();
            component.set("v.badgeList", badges);
          } else if (state === "ERROR"){
            console.log('Error: ' + JSON.stringify(response.error));
          } else {
            console.log('Unknown problem, state: ' + state + ', error: ' + JSON.stringify(response.error));
          }
        });
        $A.enqueueAction(action);
      },
      //future code here
    })
  7. 单击文件>全部保存
  8. 在Salesforce中,单击“帐户”选项卡,然后选择“ API First Communications”记录。我们的帐户指标变得更加令人兴奋,不是吗?

    API First Communications帐户详细信息

  9. 单击“联系人”选项卡,然后从“最近查看的联系人”相关列表中选择Gerta Pickles,然后刷新浏览器。哇!现在我们到了某个地方。

    Gerta Pickles的联系方式

代码重点:

  • doInit我们的控制文件的方法正在打电话给两个不同的功能:getLabelForRecordgetBadgesForRecord。仅通过利用帮助程序类在Lightning中支持这种级别的复杂性(即,同步调用多个函数)。
  • 我们正在对服务器进行两次调用(而不是将所有操作组合到一个调用中),以使组件的标题标记正确显示,即使记录中没有要显示的指标也是如此。
  • 为了不对服务器进行不必要的调用,我们修改了getLabelForRecordhelper方法,仅在objLabel尚未使用有效数据填充属性时才调用服务器。
  • 我们使用aura:iteration,并将整个Indicator对象传递给我们的IndicatorBadge组件,而不是分解单个属性。因为我们将@AuraEnabled标记添加到了指标内部类的属性中,所以我们可以在组件内部使用点表示法并引用这些值。

指示器徽章所有事情!

我们已将组件添加到“客户”和“联系人”记录页面上。让我们真正地动态起来,并将组件添加到ZBSLightning应用程序的所有记录页面中。因为有了徽章,一切都会变得更好。

  1. 在Salesforce中,从应用启动器(应用启动器图标)中找到并选择ZBSLightning,然后单击“显示”选项卡。从列表中选择“不为空”。(如果“最近查看”列表中没有记录,请更改为“所有节目”列表。)
  2. 单击齿轮图标(齿轮图标),然后选择“编辑页面”以打开Lightning App Builder。
  3. IndicatorBadges自定义组件从“闪电组件”列表拖到页面上,并将其放在右列中。
  4. 点击保存
  5. 点击激活
  6. 点击分配为组织默认值,然后单击下一步,然后保存
  7. 单击背部以退出Lightning App Builder并返回到记录主页。
    不为空显示详细信息页面只需添加我们的组件,看看我们从该记录中发现了什么!这个节目有很多事情:这是ZBS Audience Favorite(我们决定在设置“ Audience Favorite”自定义元数据记录时显示为番茄色温度计/ custom97 SLDS图标),还有Vlog(我们将其设置为紫罗兰色电视)。而且我们可以立即看到这一点,而不必深入任何领域。让我们继续加油ZBS。
  8. 在Salesforce中,单击“联合组织”选项卡。从列表中选择任何记录。(如果“最近查看”列表中没有记录,请更改为“所有联合组织”列表。)
  9. 单击齿轮图标(齿轮图标),然后选择“编辑页面”以打开Lightning App Builder。
  10. IndicatorBadges自定义组件从“闪电组件”列表拖到页面上,并将其放在右列中。
  11. 点击保存
  12. 点击激活
  13. 点击分配为组织默认值,然后单击下一步,然后保存
  14. 单击背部以退出Lightning App Builder并返回到记录主页。

注意到任何指标吗?单击详细信息选项卡(如果尚未激活该选项卡),然后查看该IsActive字段的值。如果未选中该框,则我们的组件应该为空。在此对象上下文中,我们看到我们的组件不仅传达有关记录的复杂细节。它还可以帮助繁忙的ZBS用户注意到简单但关键的数据质量问题。

但是,如果用户更改了记录中的某些数据并且我们需要显示不同的指标,那么在当前状态下,我们的组件会发生什么变化?(提示:没有。)让我们在下一步中修复它。

构建可重复使用的闪电组件 – 创建指标徽章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方法使用动态查询来获取记录的相关字段。

构建可重复使用的闪电组件 – 创建要在Lightning App Builder中使用的组件

创建要在Lightning App Builder中使用的组件

尽管我们使用Lightning组件显示指示器标志(并且在以后的步骤中,我们甚至使用Lightning Data Service来获得没有Apex的记录级数据),但这并不意味着我们不需要Apex。实际上,我们需要使用一些Apex来使我们的指标徽章记录以及其他信息可供我们的Lightning组件使用。

在此步骤中,我们将创建一个可感知对象的Lightning组件,使其可在Lightning App Builder中使用,并使用Apex为该组件提供一个动态的,可感知对象的标签。

创建一个指标徽章组件

  1. 点击齿轮图标(齿轮图标),然后选择开发者控制台
  2. 在开发人员控制台中,选择“文件”>“新建”>“ Lightning Component”
  3. 命名组件IndicatorBadges,选择“闪电记录页面”,然后选择“提交”
  4. 用以下代码替换组件的内容:
    <aura:component implements="force:hasRecordId,force:hasSObjectName,flexipage:availableForRecordHome">
      <aura:attribute name="objLabel" type="String" />
      <aura:attribute name="badgeList" type="Object[]"/>
      <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
      <lightning:card iconName="standard:coaching" title="{! v.objLabel +' Indicators'}" class="slds-text-title_caps">
        <div class="slds-p-left--medium slds-p-right--medium">
          <lightning:layout verticalAlign="stretch" horizontalAlign="start" multipleRows="true" pullToBoundary="small">
            <aura:iteration items="{!v.badgeList}" var="thisBadge" aura:id="theList">
              <lightning:layoutItem size="2" padding="horizontal-small">
                <!--put Indicator Badge here-->
              </lightning:layoutItem>
            </aura:iteration>
          </lightning:layout>
        </div>
      </lightning:card>
    </aura:component>
  5. 单击文件>保存

代码重点

  • 当您创建一个Lightning组件并选中Available for Record Pages复选框时,开发人员控制台提供了两个界面(即force:hasRecordIdflexipage:availableForRecordHome接口)。我们添加了第三个接口force:hasSObjectName,以使我们的组件能够感知对象和记录。
  • 我们使用Lightning基本组件为最终将成为指标徽章项目的列表创建标题和整洁的布局。我们为该组件提供了一个可识别的图标(“ standard:coaching”)和动态标题,以便用户知道他们正在查看的指示符。

创建指标徽章控制器类

在动态标题中,我们要显示用户期望的对象的名称-force:hasSObjectName接口未提供该值(标签字段)(可以访问对象的API名称)。要访问组件中Label字段的值,我们需要使用Apex。

  1. 在开发者控制台中,单击文件>新建> Apex类
  2. 命名Apex类INDICATOR_Controller
  3. 修改类,如下所示:
    public class INDICATOR_Controller {
      @AuraEnabled
      public static String getSObjectLabel(String sObjName){
        String label = Schema.getGlobalDescribe().get(sObjName).getDescribe().getLabel();
        return label;
      }
    }
  4. 单击文件>保存
  5. 修改IndicatorBadges组件,使其包含在对我们的Apex控制器的引用,方法是将其添加controller="INDICATOR_Controller" access="public"到该组件的第一行中>
  6. 您的组件标记现在应如下所示:
    <aura:component implements="force:hasRecordId,force:hasSObjectName,flexipage:availableForRecordHome" controller="INDICATOR_Controller" access="public">
      <aura:attribute name="objLabel" type="String" />
      <aura:attribute name="badgeList" type="Object[]"/>
      <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
      <lightning:card iconName="standard:coaching" title="{! v.objLabel +' Indicators'}" class="slds-text-title_caps">
        <div class="slds-p-left--medium slds-p-right--medium">
          <lightning:layout verticalAlign="stretch" horizontalAlign="start" multipleRows="true" pullToBoundary="small">
            <aura:iteration items="{!v.badgeList}" var="thisBadge" aura:id="theList">
              <lightning:layoutItem size="2" padding="horizontal-small">
                <!--Indicator Badge here-->
              </lightning:layoutItem>
            </aura:iteration>
          </lightning:layout>
        </div>
      </lightning:card>
    </aura:component>
  7. 单击右侧组件面板中的“ CONTROLLER”,然后将内容替换为以下代码:
    ({
      doInit : function(component, event, helper) {
        var sObj = component.get("v.sObjectName");
        if(sObj){
          helper.getLabelForRecord(component, sObj);
        }
      },
      //future code here
    })
  8. 点击HELPER在右侧的组件面板,并替换此代码的内容:
    ({
      getLabelForRecord : function(component, sObj){
        var action = component.get("c.getSObjectLabel");
        action.setParams({
          sObjName : sObj
        });
        action.setCallback(this, function(response){
          var state = response.getState();
          if(state === "SUCCESS"){
            var label = response.getReturnValue();
            component.set("v.objLabel", label);
          } else if(state === "ERROR"){
            console.log('Error: ' + JSON.stringify(response.error));
          } else {
            console.log('Unknown problem, state: '+ state + ', error: ' + JSON.stringify(response.error));
          }
        });
        $A.enqueueAction(action);
      },
      //future code here
    })
  9. 单击文件>全部保存

代码重点:

  • 我们使用“ INDICATOR_”作为Apex的类名称前缀,以支持我们的Indicator Badge应用程序和Lightning组件。随着我们的代码变得越来越复杂(将在下一步中执行),此模式将有助于将ZBS代码库保持为清晰的功能组。
  • 通过将controller=属性添加到标记中,我们更新了Lightning组件以了解基于Apex的控制器。
  • 我们组件的客户端控制器具有doInit执行基本健全性检查的功能(确保组件具有有效的API名称以传递给服务器),然后将对服务器的调用和对帮助者的响应处理的协调工作移交给其他人。这种使客户端控制器更简单,将复杂性交给助手的模式在生产就绪的组件中更为典型。我们将在下一步中了解原因。
  • 在我们的Apex控制器中,getSObjectLabel方法使用从Lightning组件传入的对象的API名称来获取更加用户友好的SObject Label。我们通过使用Schema类和相关方法来获取此信息。
  • 使用Schema方法返回的值不仅显示用户期望的标准对象和自定义对象的对象名称,还以该用户的语言环境设置确定的语言显示信息。(如果存在翻译版本。)

向Lightning Experience中的页面添加指示器徽章

在继续之前,我们需要做的最后一件事是将进行中的指标徽章组件放入Lightning Experience中的某些记录页面上。

  1. 在Salesforce中,单击“帐户”选项卡。单击任何记录名称。(如果“最近查看”列表中没有记录,请更改为“所有帐户”列表。)
  2. 单击齿轮图标(齿轮图标),然后选择“编辑页面”以打开Lightning App Builder。
  3. IndicatorBadges自定义组件从“闪电组件”列表拖到页面上,并将其放在“活动”和“颤动”选项卡上方的右列中。
    Lightning App Builder中的帐户记录页面
  4. 点击保存
  5. 点击激活
  6. 点击分配为组织默认值,然后单击下一步,然后保存
  7. 单击背部以退出Lightning App Builder并返回到记录主页。
    帐户记录详细信息页面
    那里!我们可以看到指标徽章组件,并且它了解它应该向我们显示“帐户指标”。让我们将组件放在另一个对象的页面上,看看是否发现任何更改。
  8. 单击联系人选项卡,然后选择任何记录。(同样,如果“最近查看”列表中没有记录,请更改为“全部”列表视图。)
  9. 重复步骤2-7。

晕!在该Contact对象上,我们可以看到该force:hasSObjectName接口和我们的Apex代码的结合,正如该组件告诉我们的那样,我们正在查看“联系指示器”。(现在,减去指标。)我们使组件能够在不同的上下文中正确运行,并开始使用与sObject无关的设计模式。挺棒的。

构建可重复使用的闪电组件 – 准备与对象无关

准备与对象无关

注意

从Spring ’19版本(API版本45.0)开始,您可以使用两个编程模型来构建Lightning组件:Lightning Web组件模型和原始的Aura组件模型。闪电Web组件和Aura组件可以在页面上共存和互操作。此内容涵盖了Aura组件。

有关Lightning Web组件的更多信息,请参见 Build Lightning Web Components路径。

介绍

在该项目中,我们帮助媒体发行公司ZBS(Zippy广播系统)将其出色的DJ,veejay和Podcast主持人与全球粉丝联系起来。为此,我们通过构建Lightning组件来为ZBS代理提供关于其Salesforce系统中的节目,联合组织和其他数据的复杂信息的快速可视化摘要。而且,我们使用自定义元数据来允许ZBS在任何对象中重用这些组件,而无需进行任何代码更改!

您将在此项目中做什么:

  1. 使用自定义元数据类型来定义功能模式。
  2. 创建自定义元数据记录以将该模式链接到业务规则。
  3. 创建一个显示在Lightning App Builder中的IndicatorBadges组件。
  4. 创建一个基于Apex的控制器和服务类,并在Lightning组件中使用它们。
  5. 使用基础的Lightning组件。
  6. 与Lightning Data Service一起使用以响应记录级别的更改。
  7. 创建具有复杂通信模式的控制器和助手标记。
  8. 自定义几个对象的记录主页,并对所有对象使用相同的组件。

创建一个新的Trailhead游乐场

对于此项目,您需要创建一个新的Trailhead Playground。滚动到该页面的底部,单击游乐场名称,然后选择创建游乐场。创建新的Trailhead游乐场通常需要3-4分钟。

注意

是的,我们的意思是全新的Trailhead游乐场!如果您使用现有的组织或游乐场,则可能会遇到无法完成挑战的问题。

安装Trailhead软件包并导入数据

我们需要做的第一件事是了解ZBS数据模型并导入一些样本数据。如果您在组织中看到一个标签为“安装软件包”的标签,那就太好了!请按照以下步骤操作。

如果不是,请从App Launcher(应用启动器)中找到并选择Playground Starter,然后按照步骤进行操作。如果您没有看到Playground Starter应用程序,请复制 此程序包安装链接, 并 在Trailhead帮助上签出“ 安装程序包或应用程序以完成Trailhead挑战”。

  1. 单击安装软件包选项卡。
  2. 粘贴04tB0000000M8Av到字段中。
  3. 点击安装
  4. 选择“仅为管理员安装”,然后单击“安装”。软件包安装完成后,您会看到一个确认页面,并收到一封电子邮件,发送到与您的游乐场关联的地址。
  5. 软件包安装后,我们需要更新其中一个软件包文件。
  6. 点击齿轮图标(设定),然后选择开发者控制台
  7. 在开发人员控制台中,选择“文件”>“打开”,然后选择“类”> ZBSDataLoadController,然后单击“打开”
  8. 用以下代码替换代码:
    global with sharing class ZBSDataLoadController {
      @RemoteAction
      global static void deleteAll() {
         // DELETE [SELECT ID FROM Account WHERE CreatedDate >= THIS_WEEK];    
         // DELETE [SELECT ID FROM property__c];    
         // DELETE [SELECT ID FROM broker__c];
         // DELETE [SELECT ID FROM bot_command__c];
      }
    }
  9. 保存文件。
  10. 在应用启动器(应用启动器)中,找到并选择ZBSLightning
  11. 单击“加载数据”,然后单击“初始化样本数据”以导入您在该项目中使用的数据。
  12. 单击 设定,然后选择设置
  13. Session在“快速查找”框中输入并选择“会话设置”
  14. 滚动到“缓存”部分,然后取消选中“启用安全和持久的浏览器缓存”以提高性能
  15. 点击保存

检查指标标记自定义元数据类型

我们为ZBS构建的解决方案的核心是快速可视化的摘要,我们称之为指示器徽章。支持此指标标志的自定义元数据类型的开头以及我们稍后将介绍的Apex模式的基本形状来自于协作的Big Thinks在Visualforce中构建的名为Weathervane的开源解决方案,该解决方案现在由大船咨询。(非常感谢Christian Carter和Beth Breisnes,这是Big Thinks的大脑!)Weathervane和ZBS的指标徽章的共同主题是能够将复杂的逻辑转换为视觉效果。我们以自定义元数据开始此转换。

自定义元数据类型有两个关键部分:自定义元数据类型和基于自定义元数据类型的记录。自定义元数据类型和自定义元数据记录之间的关系就像杯形蛋糕罐和罐中烘焙的杯形蛋糕之间的关系。每个纸杯蛋糕的形状都由罐子定义,但是蛋糕的味道,糖霜颜色和填充类型等都属于每个纸杯蛋糕,而不是罐子。

ZBS入门包包括一个称为“指示符徽章”的自定义元数据类型。让我们来看看。

  1. 在“设置”的“首页”标签中,Custom Metadata Types在“快速查找”框中输入,然后单击“自定义元数据类型”
  2. 从列表中选择指标徽章
  3. 此页面上的信息告诉我们有关模式的信息,该模式使我们能够从ZBS Salesforce实例中的不同字段和对象中获取值并创建视觉效果。换句话说,这就是我们的蛋糕罐。
  4. 创建良好模式的重要部分是为元数据类型上的字段选择正确的数据类型。您如何确保留有足够的灵活性,使得该模式可以在您的实例中使用,并且可以容忍随着时间的变化?您如何在灵活性与给用户足够的结构避免简单错误之间取得平衡?
  5. 让我们看几个关键字段,看看我们的指标徽章元数据类型如何回答这些问题。

检查指标徽章自定义字段

  1. 在“指示符徽章”自定义元数据详细信息页面上,向下滚动到该Custom Fields部分。
  2. 选择对象字段。
  3. 该字段的数据类型为Metadata Relationship,这意味着我们可以将我们的指标徽章元数据类型链接到ZBS组织元数据的其他部分。如本Metadata Relationship Options节所述,在这种情况下,此字段Entity Definition与ZBS Salesforce实例中的标准对象和自定义对象有关系,或者用更熟悉的话来说。当用户去创建一个“指示符徽章”自定义元数据记录时(我们将在一分钟内完成),“对象”字段将看起来像一个选择列表,其值与组织中可用的标准对象和自定义对象相匹配。自定义元数据类型还可以具有哪些其他类型的关系字段?让我们找出答案。
  4. 单击页面左上方的“返回指示器标志”。
  5. 在“指标徽章”详细信息页面上,再次向下滚动至该Custom Fields部分,然后选择“相关字段”
  6. 该字段也是一个关系字段,但是当查看时Metadata Relationship Options,我们看到该字段具有另一种类型的关系。而不是链接到标准或自定义对象,我们链接到标准和自定义字段。我们还可以看到此自定义字段由我们的对象自定义关系字段控制。这意味着,当用户决定使用Account“对象”字段中的值作为指标标记记录时,“相关字段”将显示“帐户”字段的选择列表。因此,用户不必完全记住(或拼写!)API名称即可将记录与对象和字段连接起来。使用关系字段代替硬编码的字符串还意味着我们可以更改对象或字段的名称,并且我们的记录与任何更改保持同步。
  7. 我们的“指标标志”自定义元数据类型的其余字段可帮助定义逻辑,以确定记录是否应显示指标,以及显示时指标的外观。我们混合使用文本字段和选择列表字段来实现此模式。
  8. 我们的选择列表之一尚未完成。在继续之前,让我们深入研究并解决该问题。

完成徽章颜色选择列表

  1. 从“Custom Fields指示器徽章”详细信息页面的部分中,选择“徽章颜色”选择列表。
  2. 向下滚动到该Values部分,然后选择“新建”
  3. 输入RosyBrown作为值。
  4. 点击保存
  5. 既然我们已经了解了指标徽章的基本形状,并且已经完成了所有字段,那么让我们为自定义元数据记录构建一个列表视图,以帮助我们了解如何将这种自定义元数据类型用于ZBS。

创建一个显示所有指标的列表视图

  1. 在“指标标志”元数据详细信息页面的顶部,单击“管理指标标志”按钮。
  2. 从“指标徽章”列表主页的顶部,选择“创建新视图”
  3. 填写列表视图详细信息。
    • 查看名称: All Indicators
    • 查看唯一名称: All_Indicators
  4. 滚动到步骤3。选择要显示的字段,然后选择以下字段和顺序:
    • 标签
    • 指标徽章名称
    • 目的
    • 相关领域
    • 比较类型
    • 比较值
    • 徽章图标名称
    • 徽章颜色
  5. 点击保存

现在,我们实际上可以看到我们的自定义字段,并看到我们如何使用业务逻辑和特定于ZBS的详细信息填充我们的指标徽章元数据类型创建的模式。(对于您和美食迷来说,这是我们的美味蛋糕!)我们可以看到Active Subscriber记录正在寻找该Active Subscriptions字段中值为1或更大的Accounts 。该Content Advocate记录寻找与在一个2个或更多的价值联系人Total Account Subscriptions 场。该Active Syndication记录被连接到自定义复选框(或布尔数据类型)字段中的聚合自定义对象上。每个自定义元数据记录还定义了用户对于特定徽章应该看到的图标形状和颜色,即一旦我们构建了一些组件和Apex类。

创建自定义元数据记录

在构建组件并开始使用代码之前,我们需要解决最后的配置问题。ZBS还希望根据其业务规则显示一些其他种类的指标。我们需要通过创建一些其他的指标徽章自定义元数据记录来帮助他们。

  1. 在“设置”的“首页”标签中,Custom Metadata Types在“快速查找”框中输入,然后单击“自定义元数据类型”
  2. 选择管理记录
  3. 创建具有以下值的记录:
    • 标签: Audience Favorite
    • 指标徽章名称: Audience_Favorite
    • 对象:显示
    • 相关领域:主动联合组织
    • 比较类型:大于或等于
    • 比较值: 3
    • 徽章图标名称: custom:custom97
    • 徽章颜色:番茄
  4. 注意“徽章图标名称”字段如何具有一些帮助文本,解释了用户应如何在该字段中输入数据。这样,自定义元数据字段的行为就像常规对象字段一样。与对象一样,您可以为自定义元数据类型创建验证规则,以确保记录遵循预期的行为。
  5. 我们用于“徽章图标名称”字段的结构基于 Salesforce闪电设计系统(SLDS)以及这些图标的名称。对于“观众最爱”徽章,我们使用的是SLDS的“ custom97”图标,它是一个温度计: SLDS Custom97图标。我们徽章的颜色将与“徽章颜色”字段匹配。整洁吧?
  6. 点击保存并新建。创建具有以下值的记录:
    • 标签: Needs Some Love
    • 指标徽章名称: Needs_Some_Love
    • 对象:显示
    • 相关领域:主动联合组织
    • 比较类型:小于或等于
    • 比较值: 2
    • 徽章图标名称: custom:custom94
    • 徽章颜色:RosyBrown
  7. 点击保存并新建。创建具有以下值的记录:
    • 标签: Subscription Superpower
    • 指标徽章名称: Subscription_Superpower
    • 对象:帐户
    • 相关领域:有效订阅
    • 比较类型:大于或等于
    • 比较值: 3
    • 徽章图标名称: custom:custom1
    • 徽章颜色:DeepSkyBlue
  8. 点击保存并新建。创建具有以下值的记录:
    • 标签: Syndication Rockstar
    • 指标徽章名称: Syndication_Rockstar
    • 对象:联系人
    • 相关领域:主动联合组织
    • 比较类型:大于或等于
    • 比较值: 2
    • 徽章图标名称: standard:calibration
    • 徽章颜色:红色
  9. 点击保存并新建。创建具有以下值的记录:
    • 标签: Syndication Superpower
    • 指标徽章名称: Syndication_Superpower
    • 对象:帐户
    • 相关领域:主动联合组织
    • 比较类型:大于或等于
    • 比较值: 3
    • 徽章图标名称: custom:custom49
    • 徽章颜色:DeepPink
  10. 点击保存并新建。创建具有以下值的记录:
    • 标签: Vlog
    • 指标徽章名称: Vlog
    • 对象:显示
    • 相关字段:格式
    • 比较类型:包含
    • 比较值: Vlog
    • 徽章图标名称: custom:custom99
    • 徽章颜色:紫罗兰色
  11. 点击保存