学习目标
完成本单元后,您将能够:
- 识别何时需要使用Apex处理Salesforce数据。
- 用两种不同的方式呼叫Apex。
- 使用Apex和lightning-datatable处理记录列表。
闪电Web组件中的Apex
我们已经介绍了Lightning Data Service的好处以及如何使用它,但是有时,lightning-record-*-form
组件或LDS线适配器和功能都不适合特定的用例。例如,当您要自定义单记录数据事务或对单个事务执行多记录操作时,Apex是最佳选择。
将Apex方法与Lightning Web Components一起使用
在闪电网络组件使用的顶点方法必须是static
, public
或者global
,并用注释 @AuraEnabled
立即方法定义之前。该 @AuraEnabled
注释使其可闪电部件(两个闪电Web组件和Aura组件)的顶点方法。
允许框架缓存数据可消除重复的服务器调用,从而使以后的读取操作运行更快。通过cacheable = true
在@AuraEnabled
批注中进行设置,我们将方法标记为可缓存 。当@AuraEnabled
方法是可缓存的时,不允许进行数据操作语言(DML)操作。在此示例的第2行中,我们使getRelatedContacts
方法可缓存。
AccountController.cls
当方法是可缓存的时,直到刷新缓存后,才会返回新添加或更改的记录版本。在下一节中了解如何手动刷新缓存。
从LWC调用Apex方法
与Lightning Web组件中的Apex方法进行交互的方法有两种:连接方法或强制调用方法。让我们考虑两种方法。
使用@wire致电Apex
要连接Apex方法,该方法必须是可缓存的。要连线可缓存的Apex方法,请使用@wire
装饰器(与使用LDS连线适配器的方式相同)。以这种方式调用Apex会将控件委派给Lightning Web Components引擎并创建响应式服务。每次传递给Apex方法的参数值更改时,Apex方法都会将新值提供给修饰的属性或函数。由于有线方法必须是可缓存的,因此数据可以来自LDS缓存或服务器。要刷新Apex方法缓存的数据,请调用 refreshApex 函数。
注意: Lightning Data Service无法识别Apex方法缓存的数据。当LDS函数更新记录时,该更新对Apex方法缓存的数据没有影响。
这是@wire
用于调用Apex的示例。此代码获取帐户的相关联系人。
wireApexProperty.js
代码重点:
- 第2行:我们
getRelatedContacts
从AccountController
Apex类导入函数 。这指向相应的Apex方法。 - 第4行:我们定义了一个
@api recordId
属性,以便FlexiPage将当前记录的ID传递给组件。 - 第5行:
@wire
装饰器收到两个参数:我们要调用的Apex方法(getRelatedContacts
)和适配器需要的参数(accountId
)。我们将其$recordId
作为反应变量传递 (以开头$
)。 - 第6行:结果存储在
contacts
属性中。 - 第5至6行:最初,Apex方法将数据置备给
contacts
属性,并将该数据存储在LDS缓存中。由于$recordId
是反应型的,因此每次其值更改时,Apex方法都会从缓存或服务器中配置新数据。
紧急呼叫Apex
调用Apex的另一种方法@wire
是强制性地调用Apex。当您需要控制读取操作的调用以及修改记录时,必须强制调用Apex。要强制调用Apex,请一次从组件的JavaScript文件中调用Apex,而不是将控件委派给Lightning Web Components引擎。作为回报,您将获得JavaScript承诺(就像您必须强制调用LDS函数时所做的那样)。
您可以强制调用可缓存和不可缓存的Apex方法。要刷新可缓存方法的缓存,请再次调用该方法。
在callApexImperative.js示例中,当用户单击 lightning-button
.html文件(未显示)中的a时, handleButtonClick
将getRelatedContacts
强制调用Apex方法。
callApexImperative.js
代码重点:
- 第2行:我们
getRelatedContacts
从AccountController
类中导入函数 。 - 第4行:我们定义了一个公共
recordId
属性,以便FlexiPage可以传递该组件正在为其显示相关联系人的帐户的ID。 - 第6-7行:当
handleButtonClick
框架调用该getRelatedContacts
方法时,我们必须强制调用Apex方法,并传递accountId
方法需要获取正确客户的相关联系人的。 - 第9-14行:第6行中的命令式Apex调用返回了一个promise。如果Apex方法调用成功,则实现诺言并
then
运行该 方法。否则,承诺将被拒绝,该catch
方法将运行。
在Lightning Web组件中使用记录列表的首选方法是使用 基本组件。使用创建表格数据的功能,如无限滚动,内联编辑,标题和行级的动作,调整大小,等等。该UI组件需要提供数据。生成该数据的最常见方法是以本模块前面介绍的任何一种方式调用Apex。 lightning-datatable
lightning-datatable
部署在表中列出记录的Lightning Web组件
让我们来看一个示例,该示例在中显示现有帐户的列表 lightning-datatable
。我们将使用Apex并@wire
检索记录。
- 创建一个名为的Apex类
AccountController
:- 在“资源管理器”窗格中,右键单击classes文件夹,然后选择SFDX:Create Apex Class。
- 输入班级名称,
AccountController
然后按 Enter。 - 再次 按Enter接受默认目录。
- 用以下代码替换AccountController类的内容:
代码重点:
- 第2行:我们使用注释方法,
@AuraEnabled(cacheable=true)
以便将结果缓存。 - 第3行:我们
getAccounts
在Apex中定义了方法,以执行读取操作并检索现有帐户。
- 第2行:我们使用注释方法,
- 创建名为的Lightning Web组件
accountList
。 - 用以下代码替换accountList.js文件的内容:
代码重点:
- 第2至4行:与前面的示例一样,我们导入字段引用。
- 第5行:我们
getAccounts
从AccountController类导入函数。 - 第13行:我们
@wire
与getAccounts
函数一起使用来检索数据。 - 第14行:我们将结果存储在
accounts
属性中。如果操作成功,则可以在上访问记录accounts.data
。如果失败,则错误出现在中accounts.error
。
- 用以下代码替换accountList.html文件的内容:
代码重点:
- 行4-9:我们定义的
lightning-datatable
基础组件使用accounts.data
和columns
被JavaScript文件中填充。
- 行4-9:我们定义的
- 保存您的AccountController类。
- 使用以下代码替换accountList.js-meta.xml的内容,以便该组件可在应用程序页面上使用:
- 保存所有三个组件文件。
- 将force-app / main / default文件夹部署到您的Trailhead Playground。
- 在您的Trailhead游乐场中,导航到Lightning App Builder,然后打开“使用数据”页面。
- 将accountList组件拖到页面的主要区域。
- 保存页面。
- 返回“使用数据”页面以查看新组件。
现在,您知道了与Lightning Web组件中的Salesforce数据进行交互的几种方法。接下来,您将学习如何在发生服务器错误时进行处理。