快速入门:探索Lightning Web Components OSS食谱示例应用程序 – 了解Lightning Web Components OSS食谱示例应用程序

了解Lightning Web Components OSS食谱示例应用程序

使用食谱样本应用程序

现在已经部署了该应用程序,让我们深入研究它的工作原理。

应用程序中的每个磁贴都是一个食谱,该食谱向您展示如何用30行或更少的代码行为特定任务编码。左侧的菜单项代表配方组。例如,“ Hello”菜单的配方显示了基本的框架功能,而“ Misc”菜单的配方显示了如何进行REST API调用或在不同组件之间共享JavaScript代码。

您可以通过两种方式访问​​配方的源代码。

  1. 单击查看源链接,直接将您带到GitHub上的源代码。
  2. 使用您选择的集成开发环境(IDE)查看相应的源代码。组件的名称与图块标题相对应。

让我们来看看每组中的一些食谱。

在本地主机上本地运行的LWC OSS Recipes App:3001

你好

“ Hello”菜单中的前几个食谱向您展示了基本的Lightning Web组件结构是什么样的,数据绑定如何工作,以及如何利用标准HTML事件来构建交互式组件。

HelloBinding

HelloBinding配方所示的输入字段的值是如何被绑定到一个JavaScript性能,以及如何改变其值将自动更新UI。打开食谱应用程序

  1. 单击“ Hello”菜单。
  2. 找到HelloBinding卡。
  3. 更新“名称”字段中的文本。
  4. 字段顶部的消息将立即更改以显示更新的名称。

HelloConditonalRendering

可以基于不同的条件(例如用户操作,数据可用性,错误发生等)隐藏或显示组件中的HTML元素。要查看如何有条件地隐藏和显示元素,让我们集中讨论HelloConditonalRendering配方。

  1. 找到HelloConditonalRendering卡。
  2. 选中显示详细信息复选框。
  3. 带有文本“这些就是细节!”的元素。出现。

使用if:trueif:false指令可以实现元素的有条件渲染, 并且将 指令作为属性添加到必须有条件渲染的元素中。该指令使用JavaScript属性的布尔值。每当属性值更改时,模板都会自动重新呈现以显示/隐藏元素。

组成

组件是页面或应用程序的构建块。您也可以将零部件组装在一起以制造其他零部件。

组成基础

要查看实际的成分组成,让我们使用CompositionBasics配方。

  1. 单击合成菜单。
  2. 找到CompositionBasics卡。

该配方组件包括两个子组件。

  • ContactTile组件,以红色突出显示。
  • ViewSource组件,以绿色高亮显示。这会将配方链接到其源代码。

屏幕截图突出显示了CompositionBasics组件中的两个子组件

在LWC HTML模板中,当将组件名称嵌入另一个组件中时,我们遵循kebab大小写表示法。因此,要嵌入配方名称空间的contactTile组件,我们在CompositionBasics的模板中进行编写。<recipe-contact-tile>

这样,您可以组合和重用不同的组件来创建用户界面。

亲子

在构建可重用组件时,通常需要使它们动态化,以便它们的输出和行为可以根据其父组件发送给它们的信息而有所不同。

api属性

要查看实际的父母与孩子之间的交流,让我们集中讨论ApiProperty食谱。

  1. 单击“父母对孩子”菜单。
  2. 找到ApiProperty卡。
  3. 更新百分比字段中的值。
  4. 嵌入式chartBar组件中的进度栏将自动更新。

为了进行父子沟通,子组件通过@api向其添加装饰器来公开公共属性 。然后,父级可以通过将公开属性的值作为HTML属性添加到嵌入式子组件中来设置它们的值。

对于chartBar组件,该percentage属性公开给父对象。

儿童对父母

迟早您需要将数据从子组件传递到其父项或祖父母项。

EventWithData

要查看儿童与父母之间的交流活动,让我们集中讨论EventWithData配方。

  1. 单击“孩子到父母”菜单。
  2. 找到EventWithData卡。
  3. 单击列表中任何联系人的姓名。
  4. 所选联系人的详细信息显示在列表的右侧。

在此配方中,EventWithData(父级)组件包含一个ContactListItem(子级)组件的列表。每个ContactListItem组件均显示化身和联系人姓名作为链接。当用户单击联系人的姓名时,联系人的详细信息显示在联系人列表的右侧。

为了做到这一点,子组件:

  1. handleClick当用户单击链接时触发事件处理程序。
  2. 实例化名为的自定义事件 select
  3. 使用联系人的ID流行自定义事件的detail属性。
  4. 调度(触发)事件。

在父组件内部:

  1. 在HTML文件中,使用onselect子组件上的属性来附加事件处理程序。注意,要侦听事件,组件将使用语法为的HTML属性on<eventtype>
  2. 然后,事件处理程序传递事件中的传入详细信息以显示联系人详细信息。

杂项和第三方库

杂项”菜单项包含一些食谱,这些食谱向您显示如何与多个组件共享JavaScript代码,如何从REST服务获取数据,如何从JavaScript代码访问DOM元素等等。

3rd Party Libs菜单项中的食谱向您展示如何将第三方JavaScript库与Lightning Web组件一起使用。配方使用d3.jschart.js创建丰富的可视化效果并moment.js计算日期/时间值。

还有下一个技巧

希望这些食谱能激发您的想象力,并且您为使用LWC构建功能全面的应用程序而感到兴奋。如果是这样,请转到“使用Lightning Web Components开源构建您的第一个应用程序”项目来创建示例会议管理应用程序。

快速入门:探索Lightning Web Components OSS食谱示例应用程序 – 部署Lightning Web Components OSS食谱示例应用程序

部署Lightning Web Components OSS食谱示例应用程序

学习目标

在此项目中,您将:

  • 了解有关Lightning Web Components开源的信息。
  • 在本地部署“食谱”示例应用程序。

关于这个项目

在此快速入门项目中,您将从Trailhead样本库安装样本应用程序。该应用程序提供了一些示例,您可以使用这些示例来了解Lightning Web Components。它还具有代码,可让您从头开始开发自己的Lightning Web组件。

重要的是要注意,这是唯一完全在Salesforce平台之外运行的示例应用程序。要浏览在Salesforce平台上运行的其他示例应用程序,请查看快速入门:浏览示例应用程序库项目。

关于Lightning Web Components开源

Web标准的创新水平达到了前所未有的高度,令人兴奋。现在,需要框架的许多功能已成为标准配置。您不再需要专有的组件模型,专有的语言扩展,专有的模块等等。

核心堆栈的标准化为新型框架打开了大门:这些框架的主要任务不再是填补核心堆栈中的空白,而是在标准堆栈的顶部提供薄薄的专业服务。适用于大型应用程序开发。这里有一些好处。

  • 通用且可互操作的组件模型。
  • 通用编程模型。
  • 可转让的技能使查找和扩充开发人员变得更加容易。
  • 更好的性能,因为核心功能是在Web引擎中本地实现的,而不是在JavaScript中编写的框架抽象中实现的。

闪电Web组件(LWC)开源是基于Web标准构建的新型轻量级框架的实现。它使用自定义元素,模板,影子DOM,装饰器,模块和ECMAScript 6及更高版本中可用的其他新语言构造。您可以使用此框架并使用喜欢的工具(例如Webpack,TypeScript和Babel)构建应用程序,然后在Heroku,Google或其他任何地方运行它。

关于食谱样本应用程序

食谱应用程序是一组易于理解的代码示例,可帮助您学习Lightning Web Components。大多数示例包含30行以下代码,范围从基本框架功能(Hello World示例)到使您可以与d3.js之类的第三方JavaScript库进行交互的示例。

该应用程序在Node.js上运行,可以部署在本地或您选择的平台上。请按照以下步骤在本地部署应用程序。

安装Git

Git是一个分布式版本控制系统,用于在开发生命周期中跟踪源代码的更改。它提供了各种命令来帮助您通过命令行或基于其之上构建的各种图形用户界面(GUI)来管理这些更改。

  1. 从https://git-scm.com/downloads安装Git 。接受所有默认安装设置。
  2. 确认已安装Git。在终端(macOS)或命令提示符(Windows)中,输入以下命令:
    git
    输出应为git命令列表。

安装Node.js

Node.js是一个JavaScript运行时环境,可在Web浏览器之外执行JavaScript代码。它通常用于创建命令行工具和在服务器上运行JavaScript代码。

  1. 从https://nodejs.org/en/安装Node.js的长期支持(LTS)版本。
  2. 确认已安装Node.js。在终端(macOS)或命令提示符(Windows)中,输入以下命令:
    node -v
    您应该看到v12.16.0或更高版本的输出。

安装程序包管理器

程序包管理器有助于程序包安装,版本管理和依赖性管理。有两种广泛使用的Node.js软件包管理器:npm和yarn。

npm是默认的程序包管理器,并且在安装Node.js时默认安装。

  • 确认已安装npm。在终端(macOS)或命令提示符(Windows)中,输入以下命令:
    npm
    输出应为所有npm命令的列表。

注意

注意

根据您的喜好,您也可以安装和使用纱线。

部署应用

既然已经安装了所有工具,请在终端(macOS)或命令提示符(Windows)中输入以下命令。

  1. 输入以下命令以克隆lwc-recipes-oss存储库。
    git clone https://github.com/trailheadapps/lwc-recipes-oss
    cd lwc-recipes-oss
  2. 输入以下命令以使用npm(或根据需要,使用yarn)安装项目依赖项。
    npm install
  3. 输入以下命令以监视模式启动该应用程序。
    npm run watch
  4. 打开浏览器窗口,然后输入以下URL以访问默认应用程序。
    1. 苹果电脑: http://localhost:3001
    2. 视窗: http://0.0.0.0:3001

您应该看到如下图所示的食谱应用程序。

在本地主机上本地运行的LWC OSS Recipes App:3001

恭喜你!您已成功设置并运行了Lightning Web Components开源示例应用程序。在下一步中,您将仔细查看该应用程序。

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

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

添加了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. 点击保存

使用Lightning Web Components开源构建您的第一个应用程序 – 创建会话详细信息Web组件

创建会话详细信息Web组件

在此步骤中,您将创建一个新的Web组件,该组件显示特定会议会话的详细信息。您还实现了一个简单的导航系统,该系统允许用户在会话列表和会话详细信息之间来回导航。

创建sessionDetails Web组件

首先,让我们创建Web组件的JavaScript文件。

  1. 在现有my文件夹下,创建一个名为的新文件夹sessionDetails
  2. sessionDetails文件夹中,创建一个名为的新文件sessionDetails.js
  3. 实现sessionDetails类,如下所示:
    import { LightningElement, api } from 'lwc';
    import { getSession } from 'data/sessionService';
    export default class SessionDetails extends LightningElement {
      session;
      @api
      set sessionId(id) {
        this._sessionId = id;
        this.session = getSession(id);
      }
      get sessionId() {
        return this._sessionId;
      }
    }

    我们使用@api装饰器将sessionIdsetter方法定义为public。这样,您就可以提供标签sessionId 的属性my-session-details。带注释的属性@api是反应性的:当其值更改时,组件将自动重新呈现。

  4. 保存sessionDetails.js文件。

现在,让我们在Web组件模板中创建用户界面。

  1. sessionDetails文件夹中,创建一个名为的新文件sessionDetails.html
  2. 实施模板,如下所示:
    <template>
      <template if:true={session}>
        <h2>{session.name}</h2>
        <p class="icon time">{session.dateTime}</p>
        <p class="icon room">{session.room}</p>
        <h3>Abstract</h3>
        <div class="abstract">{session.description}</div>
      </template>
    </template>
    
  3. 保存sessionDetails.html文件。

接下来,让我们创建Web组件的CSS文件,以确保一切看起来都不错。

  1. sessionDetails文件夹中,创建一个名为的新文件sessionDetails.css
  2. 定义以下样式:
    :host {
      width: 100%;
      margin: 2rem;
      color: #080707;
    }
    p {
      margin: 0;
    }
    .icon {
      color: #039be5;
      background-repeat: no-repeat;
      background-size: contain;
      padding-left: 24px;
    }
    .icon.time {
      background-image: url(https://developer.salesforce.com/files/js-dev/icons/clock.svg);
      margin-top: .6rem;
    }
    .icon.room {
      background-image: url(https://developer.salesforce.com/files/js-dev/icons/location.svg);
      margin-top: .4rem;
    }
    h2 {
      font-weight: 600;
      font-size: 1.4rem;
    }
    h2 a, h2 a:visited {
      color: #039be5;
      text-decoration: none;
    }
    h2 a:hover {
      color: #017bb7;
    }
    h3 {
      font-weight: bold;
      font-size: 1.1rem;
      margin: 1.5rem 0 0.5rem 0;
    }
    .list-wrapper {
      display: flex;
      flex-direction: column;
    }
    .speaker-list {
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
      margin: 0 -0.5rem;
    }
  3. 保存sessionDetails.css文件。

而已!您创建了一个显示会议会话详细信息的Web组件。

将组件添加到应用程序

要查看它的实际效果,您需要将其添加到应用程序中。

  1. 打开app.html该文件app的文件夹。
  2. 在标签之后添加以下<my-session-list></my-session-list>标签:
    <my-session-details session-id={sessionId}></my-session-details>
  3. 保存app.html文件。
  4. 打开app.js文件。
  5. 在App类定义中定义一个属性:
    import { LightningElement } from 'lwc';
    export default class App extends LightningElement {
      sessionId;
    }
  6. 保存app.js文件。

返回浏览器,请注意该sessionDetails组件未出现。这是因为sessionId您刚刚定义的 属性app.js尚未指向实际的sessionId。换句话说,应用程序不知道要显示哪个会话。这就提出了一个很好的问题:sessionDetails 组件应实际显示哪个会话?答案是:用户在sessionList组件中单击的会话!sessionList组件如何通知应用程序单击了特定会话?通过调度自定义DOM事件。

一起布线

现在,您已经创建了所有不同的组件,您需要在应用程序的不同方面显示它们,并确保不同的组件相互反应。首先,让我们修改sessionList组件,使其在单击会话时触发一个事件。

  1. 打开sessionList.html文件。
  2. 将以下属性添加<a>标签:data-index={index} onclick={handleSessionClick}它看起来像 
    <a key={session.id} class="session" data-index={index} onclick={handleSessionClick}>
  3. 保存sessionList.html文件。
  4. 打开sessionList.js文件。
  5. handleSessionClick函数SessionList之后,将事件处理程序添加到类中handleSearchKeyInput
    handleSessionClick(event) {
      const index = event.currentTarget.dataset.index;
      const navigateEvent = new CustomEvent('navigate', {
        detail: {
          sessionId: this.sessions[index].id
        }
      });
      this.dispatchEvent(navigateEvent);
    }
  6. 保存sessionList.js文件。

接下来,让我们在appWeb组件中监听该事件。

  1. 打开app.html文件。
  2. onnavigatemy-session-list标签上添加一个属性:
    <my-session-list onnavigate={handleNavigate}></my-session-list>
  3. 保存app.html文件。
  4. 打开app.js文件。
  5. handleNavigate之后添加事件处理程序sessionId;
    handleNavigate(event) {
      this.sessionId = event.detail.sessionId;
    }
  6. 保存app.js文件。

返回浏览器,然后单击其中一个会话。现在,该会话的详细信息应出现在列表之后。 

在会话列表下呈现对话信息的应用程序。

一切正常,但是滚动到列表底部以查看详细信息并不是很好的用户体验。您可以在列表的右侧显示详细信息,但这可能不适用于移动设备。在下一部分中,您将实现一个基本的导航系统,该系统允许用户导航到不同的视图。

添加导航

导航是单页应用程序的重要组成部分。在此项目中,您将为应用程序使用两个状态(“列表”和“详细信息”)实现最小导航系统,并使用自定义事件在这些状态之间进行导航。

  1. 打开app.js文件。
  2. 声明一个state产权后sessionId;
    state = 'list';
  3. 修改handleNavigate事件处理程序更改应用程序的基础上,自定义导航事件值的状态。
    handleNavigate(event) {
      this.state = event.detail.state;
      this.sessionId = event.detail.sessionId;
    }
  4. 添加两个可以在组件模板中使用的getter函数,以检查应用程序的当前状态。
    get isStateList() {
      return this.state === 'list';
    }
    get isStateDetails() {
      return this.state === 'details';
    }
  5. 保存app.js文件。
  6. 打开app.html文件。
  7. <my-session-list>在一个if:true指令时,应用程序的状态是“清单”,只显示它:
    <template if:true={isStateList}>
      <my-session-list onnavigate={handleNavigate}>
      </my-session-list>
    </template>
    
  8. <my-session-details>在一个if:true指令时,应用程序的状态是“细节”,只显示它:
    <template if:true={isStateDetails}>
      <my-session-details session-id={sessionId}>
      </my-session-details>
    </template>
  9. onnavigatemy-session-details标签上添加一个属性:
    <my-session-details onnavigate={handleNavigate} session-id={sessionId}>
    </my-session-details>
  10. 保存app.html文件。

接下来,让我们确保选择会话时更改状态。

  1. 打开sessionList.js文件。
  2. handleSessionClick事件处理函数替换为:
    handleSessionClick(event) {
      const index = event.currentTarget.dataset.index;
      const navigateEvent = new CustomEvent('navigate', {
        detail: {
          state: 'details',
          sessionId: this.sessions[index].id
        }
      });
      this.dispatchEvent(navigateEvent);
    }
  3. 保存sessionList.js文件。

接下来,让我们确保用户可以返回到会话列表。

    1. 打开sessionDetails.html文件。
    2. 将会话标题替换<h2>{session.name}</h2>
<h2><a href="#" onclick={handleSessionsClick}>Sessions</a> &gt; {session.name}</h2>
  1. 保存sessionDetails.html文件。
  2. 打开sessionDetails.js文件。
  3. handleSessionsClick事件处理程序添加sessionDetails类中,紧接在sessionIdgetter函数之后:
    handleSessionsClick() {
      const navigateEvent = new CustomEvent('navigate', {
        detail: {
          state: 'list'
        }
      });
      this.dispatchEvent(navigateEvent);
    }
    
  4. 保存sessionDetails.js文件。

返回浏览器,然后单击其中一个会话。现在,会话列表显示单击的会话的详细信息视图。如果单击会话标题旁边的“会话”链接,则返回到会话列表。

Web组件介绍的会话详细信息视图

很好!会议与会者单击特定的会议时,可以查看会议列表并导航到详细信息视图。为了将您学到的东西付诸实践,创建一个最终的Web组件,该组件在会话详细信息视图上显示扬声器卡。

添加扬声器卡

首先,让我们创建Web组件的JavaScript文件。

  1. 在现有my文件夹下,创建一个名为的新文件夹speakerCard
  2. speakerCard文件夹中,创建一个名为的新文件speakerCard.js
  3. 实现SpeakerCard该类,如下所示:
    import { LightningElement, api } from 'lwc';
      export default class SpeakerCard extends LightningElement {
        @api speaker;
    }
  4. 保存speakerCard.js文件。

接下来,让我们创建Web组件的HTML模板。

  1. speakerCard文件夹中,创建一个名为的文件speakerCard.html
  2. 实施模板,如下所示:
    <template>
      <div class="card">
        <div class="header">
          <img src={speaker.pictureUrl} alt="Speaker picture">
          <div>
            <p class="title">{speaker.name}</p>
            <p class="icon email">{speaker.email}</p>
          </div>
        </div>
        {speaker.bio}
      </div>
    </template>
  3. 保存speakerCard.html文件。

接下来,让我们添加一些样式以确保一切都看起来不错。

  1. speakerCard文件夹中,创建一个名为的文件speakerCard.css
  2. 添加以下样式:
    :host {
      margin: 0.5rem;
      flex: 1;
      color: #080707;
    }
    .card {
      border: 1px solid #dddbda;
      border-radius: 0.25rem;
      padding: 1rem;
    }
    .card .header {
      display: flex;
      align-items: center;
      margin-bottom: 1rem;
    }
    .card img {
      border-radius: 50%;
      height: 5rem;
      margin-right: 1rem;
    }
    .card .title {
      font-weight: 600;
    }
    .card .icon {
      color: #039be5;
      background-repeat: no-repeat;
      background-size: contain;
      padding-left: 24px;
    }
    .card .icon.email {
      background-image: url(https://developer.salesforce.com/files/js-dev/icons/email.svg);
      margin-top: 0.4rem;
    }
    p {
      margin: 0;
    }
  3. 保存speakerCard.css文件。
将发言人添加到会话详细信息

最后,让我们将扬声器卡添加到会话详细信息视图中。

  1. 打开sessionDetails.html文件。
  2. abstractdiv之后添加以下标记:
    <h3>Speakers</h3>
      <div class="speaker-list">
        <template if:true={session.speakers}>
          <template for:each={session.speakers} for:item="speaker">
            <my-speaker-card key={speaker.id} speaker={speaker}>
            </my-speaker-card>
        </template>
      </template>
    </div>
  3. 保存sessionDetails.html文件。

返回浏览器窗口,然后单击列表中的会话。会话详细信息视图现在应该看起来像这样,包括扬声器卡。

 Web组件模式和最佳实践的会话详细信息视图,每个会话发言人都需要额外的卡片

恭喜,您已经成功创建了第一个Lightning Web Component开源应用程序!请查看本系列的下一个项目,在该项目中您可以修改应用程序以使用REST服务从Salesforce获取会议数据。您无需了解Salesforce即可执行下一个项目。我们将指导您完成所有步骤。