Lightning-数据服务(3)

学习目标

完成本单元后,您将能够:

  • 解释Lightning Data Service如何使用通知。
  • 使用recordUpdated来处理错误并记录更改。

记录更改

在最后一个单元中,我们介绍了Lightning Data Service如何处理CRUD。现在让我们来看看如何在记录更改时采取措施,以便您的组件可以响应记录加载,更改,更新或删除操作。

要在记录更改时采取措施,请处理recordUpdated事件。

<force:recordData aura:id="forceRecordDataCmp"
    recordId="{!v.recordId}" 
    layoutType="{!v.layout}"
    targetRecord="{!v.record}"
    targetFields="{!v.simpleRecord}"
    targetError="{!v.error}"
    recordUpdated="{!c.recordUpdated}" />
实现处理更改的动作处理程序。字段更改通过changedFields对象传入,该对象包含与新值关联的旧字段值。
({
    recordUpdated: function(component, event, helper) {
        var eventParams = event.getParams();
        if(eventParams.changeType === "CHANGED") {
            // 获取为此记录更改的字段
            var changedFields = eventParams.changedFields;
            console.log('Fields that are changed: ' + JSON.stringify(changedFields));
            // 记录被改变,所以刷新组件(或其他组件逻辑)
            var resultsToast = $A.get("e.force:showToast");
            resultsToast.setParams({
                "title": "Saved",
                "message": "The record was updated."
            });
            resultsToast.fire();
        } else if(eventParams.changeType === "LOADED") {
            console.log("Record is loaded successfully.");
        } else if(eventParams.changeType === "REMOVED") {
            var resultsToast = $A.get("e.force:showToast");
            resultsToast.setParams({
                "title": "Deleted",
                "message": "The record was deleted."
            });
            resultsToast.fire();
        } else if(eventParams.changeType === "ERROR") {
            console.log('Error: ' + component.get("v.error"));
        }
    }
})
当LDS检测到记录更改时,会通知使用更改记录的组件。如果您不处理更改,记录仍会更新,因此对targetRecord或targetFields属性的任何引用都会自动显示在您的组件中。对于每个强制:recordData组件引用更新的记录,LDS做两件事情。
  • LDS通过使用适当的changeType和changedFields值触发recordUpdated事件来通知所有其他的force的实例:recordData。
  • 它将每个force:recordData上的targetRecord和targetFields属性设置为新的记录值。如果targetRecord或targetFields被任何UI引用,则会自动触发重新渲染,以便UI显示最新的数据。

注意

如果force:recordData处于EDIT模式,则当记录更改时,targetRecord和targetFields不会自动更新。这是为了避免仍在进行的clobberin编辑,并防止未保存的更改出现在其他组件中。不用担心,可以通过处理recordUpdated事件并调用reloadRecord方法手动刷新记录。

当LDS检测到源自服务器的更改时,它使用相同的更改通知机制。 LDS在收到记录的新请求时检测到服务器上的更改。 LDS仅通知已注册并标记为isValid的组件。处理recordUpdated事件时,请检查changeType以确定要处理的更改类型。

错误处理

如果加载时发生错误,则将targetError属性设置为本地化的错误消息。如果强制属性:recordData无效,或者服务器不可访问且记录不在本地缓存中,则会发生错误。从那里,你决定如何显示错误。

如果记录在服务器上无法访问,那么recordUpdated事件触发changeType = REMOVED,并且没有错误设置为targetError,因为记录变得不可访问有时是预期的结果。由于记录或实体共享和可见性设置,或记录被删除,记录也可能变得不可访问。

把它放在一起

恭喜!现在您已经知道开始使用Lightning Data Service所需了解的一切。这是相对简单的,但它做了很多!在你脱颖而出并获得那个新奇的徽章之前,让我们把所有这些理论付诸实践。我们将放置一个页面,其中包含两个使用相同记录数据的组件,并正确响应记录更改。

该组件显示联系人的详细信息。请注意,它使用字段而不是layoutType,targetFields而不是targetRecord。请记住,可以包含fields或layoutType(或两者!),并且可以使用targetFields或targetRecord(或两者!)来检索记录数据。对于字段,您必须指定要查询的特定字段,而使用layoutType时,只需指定要使用的记录布局,即FULL或COMPACT。如果使用targetFields检索首选方法的数据,请在UI中使用v.targetFields.Name格式。如果您使用targetRecord,请使用v.targetRecord.fields.Name.value。

ldsShowContact.cmp

<aura:component implements="force:hasRecordId,flexipage:availableForRecordHome">

    <aura:attribute name="contactRecord" type="Object"/>
    <aura:attribute name="recordLoadError" type="String"/>
    
    <force:recordData aura:id="recordLoader"
        recordId="{!v.recordId}"
        fields="Name,Description,Phone,Industry"
        targetFields="{!v.contactRecord}"
        targetError="{!v.recordLoadError}"
    />

    <!-- 显示有关联系人详情的闪电卡 -->
    <div class="Contact Details"> 
        <lightning:card iconName="standard:contact" title="{!v.contactRecord.Name}" >
            <div class="slds-p-horizontal--small">
                <p class="slds-text-heading--small">
                    <lightning:formattedPhone title="Phone"  value="{!v.contactRecord.Phone}" /></p>
                <p class="slds-text-heading--small">
                    <lightning:formattedText title="Description" value="{!v.contactRecord.Description}" /></p>
                <p class="slds-text-heading--small">
                     <lightning:formattedText title="Industry" value="{!v.contactRecord.Industry}" /></p>
            </div>
        </lightning:card>
    </div>

</aura:component>
我们的下一个组件加载相同的联系人,但在编辑模式下,还有一个让用户编辑联系人的表单。它还处理recordUpdated事件,以便我们可以根据编辑的结果采取某些操作。
ldsEditContact.cmp

<aura:component implements="force:hasRecordId,flexipage:availableForRecordHome">

    <aura:attribute name="contactRecord" type="Object"/>
    <aura:attribute name="recordSaveError" type="String" default=""/>

    <!-- Load record in EDIT mode -->
    <force:recordData aura:id="recordLoader"
        recordId="{!v.recordId}"
        fields="Name,Description,Phone,Industry"
        targetFields="{!v.contactRecord}"
        targetError="{!v.recordSaveError}"
        mode="EDIT" 
        recordUpdated="{!c.handleRecordUpdated}" />

    <!-- Contact edit form -->
    <div class="Edit Contact">
        <lightning:card iconName="action:edit" title="Edit Contact">
            <div class="slds-p-horizontal--small">
                <lightning:input label="Contact Name" value="{!v.contactRecord.Name}"/>
                <lightning:input label="Contact Description" value="{!v.contactRecord.Description}"/>
                <lightning:input label="Contact Phone" value="{!v.contactRecord.Phone}"/>
                <br/>
                <lightning:button label="Save Contact" variant="brand" onclick="{!c.saveContact}" />
            </div>
        </lightning:card>
    </div>
    
    <!-- Display error message -->
    <aura:if isTrue="{!not(empty(v.recordSaveError))}">
        <div class="recordSaveError">
            {!v.recordSaveError}</div>
    </aura:if>

</aura:component>
最后,我们有我们的控制器,根据编辑的结果,我们的控制器会报告一个成功的编辑信息或向我们显示错误信息。
ldsEditContactController.js

({
    saveContact : function(cmp, event, helper) {
        var recordLoader = cmp.find("recordLoader");
        recordLoader.saveRecord($A.getCallback(function(saveResult) {
            if (saveResult.state === "ERROR") {
                var errMsg = "";
                // saveResult.error是一个错误数组,
                // 将所有错误收集到一个消息中
                for (var i = 0; i < saveResult.error.length; i++) {
                    errMsg += saveResult.error[i].message + "\n";
                }
                cmp.set("v.recordSaveError", errMsg);
            } else {
                cmp.set("v.recordSaveError", "");
            }
        }));
    },

    // 在更改记录时(通过任何组件),在这里控制组件行为
    handleRecordUpdated: function(component, event, helper) {
        var eventParams = event.getParams();
        if(eventParams.changeType === "CHANGED") {
            // 获取为此记录更改的字段
            var changedFields = eventParams.changedFields;
            console.log('Fields that are changed: ' + JSON.stringify(changedFields));
            // 记录被改变,所以刷新组件(或其他组件逻辑)
            var resultsToast = $A.get("e.force:showToast");
            resultsToast.setParams({
                "title": "Saved",
                "message": "The record was updated."
            });
            resultsToast.fire();
        } else if(eventParams.changeType === "LOADED") {
            // record is loaded in the cache
        } else if(eventParams.changeType === "REMOVED") {
            // record is deleted and removed from the cache
        } else if(eventParams.changeType === "ERROR") {
            console.log('Error: ' + component.get("v.error"));
        }
    }
})
你有它,你是一个闪电数据服务的主人。 现在出发,使用新发现的技能来改善各地开拓者的闪电组件的性能和一致性。

Lightning-数据服务(2)

学习目标

完成本单元后,您将能够:

  • 使用闪电数据服务创建,读取,上传和删除记录。
  • 构建一个使用force的组件:recordData。
  • 解释Lightning Data Service如何缓存记录。

使用force … recordData标签

在最后一个单元中,我们介绍了Lightning Data Service提供的漂亮的性能升级和生活质量功能。现在让我们学习如何使用它们。

请记住,force:recordData本身不包含任何UI元素。 force:recordData标签只是用来与服务器通信并管理本地缓存的逻辑。为了让用户查看和修改由LDS获取的数据,您必须包含UI元素。 force:recordData标记使用UI API向您的UI组件提供数据。

加载记录

你做的第一件事是为你的UI组件创建一个记录,就是加载它。通过在指定recordId,mode和layoutType或fields属性的同时在组件中包含force:recordData来加载记录。

ldsDisplayRecord.cmp

<aura:component implements="flexipage:availableForRecordHome, force:hasRecordId"> <!--inherit recordId attribute-->

<aura:attribute name="record" type="Object" 
  description="The record object to be displayed"/>
<aura:attribute name="simpleRecord" type="Object" 
  description="A simplified view record object to be displayed"/>
<aura:attribute name="recordError" type="String" 
  description="An error message bound to force:recordData"/>

<force:recordData aura:id="record"
    layoutType="FULL"
    recordId="{!v.recordId}"
    targetError="{!v.recordError}"
    targetRecord="{!v.record}"
    targetFields ="{!v.simpleRecord}"
    mode="VIEW"/>
从这里,包含一些显示强制加载的数据的 force:recordData.
<!-- 显示有关记录详情的闪电卡 -->
<div class="Record Details"> 
    <lightning:card iconName="standard:account" title="{!v.simpleRecord.Name}" >
        <div class="slds-p-horizontal--small">
            <p class="slds-text-heading--small">
                <lightning:formattedText title="Billing City" value="{!v.simpleRecord.BillingCity}" /></p>
            <p class="slds-text-heading--small">
                <lightning:formattedText title="Billing State" value="{!v.simpleRecord.BillingState}" /></p>
        </div>
    </lightning:card>
</div>

<!-- 显示闪电数据服务错误,如果有的话 -->
<aura:if isTrue="{!not(empty(v.recordError))}">
    <div class="recordError">
        {!v.recordError}</div>
</aura:if>

</aura:component>

保存记录

LDS的神奇之处在于,在Lightning应用程序中有多个组件可以从相同的记录数据中提取。这些组件中的一部分只是显示记录数据,而其他组件则可以操纵数据本身。该组件加载记录以及一个简短的表单,用户可以在其中输入记录的新名称。

ldsSaveRecord.cmp

<aura:component implements="flexipage:availableForRecordHome, force:hasRecordId"> <!--inherit recordId attribute-->

<aura:attribute name="record" type="Object" />
<aura:attribute name="simpleRecord" type="Object" />
<aura:attribute name="recordError" type="String" />

<force:recordData aura:id="recordEditor"
    layoutType="FULL"
    recordId="{!v.recordId}"
    targetError="{!v.recordError}"
    targetRecord="{!v.record}"
    targetFields ="{!v.simpleRecord}"
    mode="EDIT" />

    <!-- 显示有关记录详情的闪电卡 -->
    <div class="Record Details"> 
        <lightning:card iconName="standard:account" title="{!v.simpleRecord.Name}" >
            <div class="slds-p-horizontal--small">
                <p class="slds-text-heading--small">
                    <lightning:formattedText title="Billing State" value="{!v.simpleRecord.BillingState}" /></p>
                <p class="slds-text-heading--small">
                     <lightning:formattedText title="Billing City" value="{!v.simpleRecord.BillingCity}" /></p>
            </div>
        </lightning:card>
    </div>
    <br/>

    <!-- 显示编辑表格 -->
    <div class="Record Details">
        <lightning:card iconName="action:edit" title="Edit Account">
            <div class="slds-p-horizontal--small">
                <lightning:input label="Account Name" value="{!v.simpleRecord.Name}"/>
                <br/>
                <lightning:button label="Save Account" variant="brand" onclick="{!c.handleSaveRecord}" />
            </div>
        </lightning:card>
    </div>

    <!-- 显示闪电数据服务错误,如果有的话 -->
    <aura:if isTrue="{!not(empty(v.recordError))}">
        <div class="recordError">
            {!v.recordError}</div>
    </aura:if>
</aura:component>
为了处理这个更新,创建一个调用saveRecord()方法的JavaScript控制器。 saveRecord()方法只有一个回调函数SaveRecordResult作为唯一的参数。 SaveRecordResult包括一个状态属性,告诉你保存是否成功,以及其他信息可以用来处理操作的结果。
LdsSaveRecordController.js

({
    handleSaveRecord: function(component, event, helper) {
        component.find("recordEditor").saveRecord($A.getCallback(function(saveResult) {
            if (saveResult.state === "SUCCESS" || saveResult.state === "DRAFT") {
                console.log("保存成功完成");
            } else if (saveResult.state === "INCOMPLETE") {
                console.log("用户离线,设备不支持草稿.");
            } else if (saveResult.state === "ERROR") {
                console.log('问题保存记录,错误:' + 
                           JSON.stringify(saveResult.error));
            } else {
                console.log('Unknown problem, state: ' + saveResult.state + ', error: ' + JSON.stringify(saveResult.error));
            }
        }));}
})
不错,对不对? LDS处理所有幕后的繁重工作,将请求发送到服务器并自动更新这两个记录。

好,现在我们来处理其余的CRUD。

Creating Records

要创建一个空记录,请保持recordId属性有效:recordData undefined。

ldsNewRecord.cmp

<aura:component implements="flexipage:availableForRecordHome, force:hasRecordId">

<aura:attribute name="newContact" type="Object"/>
<aura:attribute name="simpleNewContact" type="Object"/>
<aura:attribute name="newContactError" type="String"/>

<force:recordData aura:id="contactRecordCreator"
    layoutType="FULL"
    targetRecord="{!v.newContact}"
    targetFields ="{!v.simpleNewContact}"
    targetError="{!v.newContactError}"
    />

<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

    <!-- 显示新的联系表格 -->
    <div class="Create Contact">
        <lightning:card iconName="action:new_contact" title="Create Contact">
            <div class="slds-p-horizontal--small">
                <lightning:input aura:id="contactField" label="First Name" value="{!v.simpleNewContact.FirstName}"/>
                <lightning:input aura:id="contactField" label="Last Name" value="{!v.simpleNewContact.LastName}"/>
                <lightning:input aura:id="contactField" label="Title" value="{!v.simpleNewContact.Title}"/>
                <br/>
                <lightning:button label="Save Contact" variant="brand" onclick="{!c.handleSaveContact}"/>
            </div>
        </lightning:card>
    </div>

    <!-- 显示闪电数据服务错误 -->
    <aura:if isTrue="{!not(empty(v.newContactError))}">
        <div class="recordError">
            {!v.recordError}</div>
    </aura:if>

</aura:component>
在组件控制器中,调用getNewRecord()方法。用户创建记录后,使用上面显示的saveRecord()方法进行保存。
ldsNewRecordController.js

({
    doInit: function(component, event, helper) {
        // 从模板准备一个新的记录
        component.find("contactRecordCreator").getNewRecord(
            "Contact", // sObject type (entityAPIName)
            null,      // recordTypeId
            false,     // skip cache?
            $A.getCallback(function() {
                var rec = component.get("v.newContact");
                var error = component.get("v.newContactError");
                if(error || (rec === null)) {
                    console.log("错误初始化记录模板:" + error);
                }
                else {
                    console.log("Record template initialized: " + rec.sobjectType);
                }
            })
        );
    },

    handleSaveContact: function(component, event, helper) {
        if(helper.validateContactForm(component)) {
            component.set("v.simpleNewContact.AccountId", component.get("v.recordId"));
            component.find("contactRecordCreator").saveRecord(function(saveResult) {
                if (saveResult.state === "SUCCESS" || saveResult.state === "DRAFT") {
                    // 记录已成功保存
                    var resultsToast = $A.get("e.force:showToast");
                    resultsToast.setParams({
                        "title": "Saved",
                        "message": "The record was saved."
                    });
                    resultsToast.fire();

                } else if (saveResult.state === "INCOMPLETE") {
                    // 处理不完整的状态
                    console.log("用户离线,设备不支持草稿");
                } else if (saveResult.state === "ERROR") {
                    // 处理错误状态
                    console.log('问题保存联系,错误: ' + 
                                 JSON.stringify(saveResult.error));
                } else {
                    console.log('未知问题,状态:' + saveResult.state +
                                ', error: ' + JSON.stringify(saveResult.error));
                }
            });
        }
    }
})
这个帮助器验证表单值。
ldsNewRecordHelper.js

({
    validateContactForm: function(component) {
        var validContact = true;

         // 如果必填字段为空,则显示错误消息
        var allValid = component.find('contactField').reduce(function (validFields, inputCmp) {
            inputCmp.showHelpMessageIfInvalid();
            return validFields && inputCmp.get('v.validity').valid;
        }, true);

        if (allValid) {
            // 验证我们有一个帐户附加到
            var account = component.get("v.newContact");
            if($A.util.isEmpty(account)) {
                validContact = false;
                console.log("Quick action context doesn't have a valid account.");
            }
        	return(validContact);
            
        }  
	}
       
})

删除记录

最后,要删除一条记录,至少指定字段属性设置为“Id”的recordId。

ldsDeleteRecord.cmp

<aura:component implements="flexipage:availableForRecordHome,force:hasRecordId">

<aura:attribute name="recordError" type="String" access="private"/>

<force:recordData aura:id="recordHandler"
    recordId="{!v.recordId}"
    fields="Id"
    targetError="{!v.recordError}"
    />

    <!-- 显示删除记录表格 -->
    <div class="Delete Record">
        <lightning:card iconName="action:delete" title="Delete Record">
            <div class="slds-p-horizontal--small">
                <lightning:button label="Delete Record" variant="destructive" onclick="{!c.handleDeleteRecord}"/>
            </div>
        </lightning:card>
    </div>

    <!-- 显示闪电数据服务错误,如果有的话 -->
    <aura:if isTrue="{!not(empty(v.recordError))}">
        <div class="recordError">
            {!v.recordError}</div>
    </aura:if>

</aura:component>
在组件的JavaScript控制器中,调用deleteRecord()方法。 LDS从缓存中删除记录并触发通知。 deleteRecord()方法使用与saveRecord()方法(deleteRecordResult)类似的回调函数,它告诉您操作是否成功。
ldsDeleteRecordController.js

({
    handleDeleteRecord: function(component, event, helper) {
    component.find("recordHandler").deleteRecord($A.getCallback(function(deleteResult) {
        if (deleteResult.state === "SUCCESS" || deleteResult.state === "DRAFT") {
            console.log("Record is deleted.");
            var resultsToast = $A.get("e.force:showToast");
            resultsToast.setParams({
                "title": "Deleted",
                "message": "The record was deleted."
            });
            resultsToast.fire();
        }
        else if (deleteResult.state === "INCOMPLETE") {
            console.log("用户离线,设备不支持草稿");
        }
        else if (deleteResult.state === "ERROR") {
            console.log('问题删除记录,错误:' +
                        JSON.stringify(deleteResult.error));
        }
        else {
            console.log('未知问题,状态:' + deleteResult.state +
                        ', error: ' + JSON.stringify(deleteResult.error));
        }
    }));
}})

异步记录保存

假设情况下的时间!因此,您使用的是Salesforce应用程序,由于连接问题,保存尝试无法到达服务器。也许你所乘坐的火车进入了一个隧道,你不小心在建筑物的那个角落里漫不经心地走过,或者那个小房间再次和细胞塔混乱了。无论如何,别担心,LDS会回来的。在发生连接问题时,Lightning Data Service会将您的更改存储在本地缓存中。这由SaveRecordResult对象中的DRAFT状态指示。记录的DRAFT状态在连接恢复时解决。通过LDS保存记录时,本地缓存不会更新,直到保存完成。在服务器上成功完成保存时,缓存将更新为服务器中记录的最新版本,并通知所有引用该记录的组件。保存后,您不必担心手动将记录重新加载到缓存中。 LDS为您处理所有的工作。

如果启用异步保存权限,或者满足以下所有条件,则设备脱机时发生的保存会导致DRAFT状态:

  • 客户端无法访问服务器。
  • 组织已启用脱机草稿。
  • 您拥有9.0或更高版本的Salesforce应用程序。

所有CRUD操作都尝试立即使用XMLHttpRequest解析到服务器。如果您的设备失去与服务器的连接,则Lightning Data Service可以从本地缓存中获取数据。 LDS是否从本地缓存或服务器提取数据取决于记录的年份,或者是否存在本地草案。如果记录足够新,或者存在本地草稿,则LDS将使用本地缓存。 LDS仅在需要时刷新记录,这意味着所有刷新都由组件触发。

创建一个Trailhead游乐场

好消息!您可以在免费的Trailhead Playground(TP)组织中练习使用LDS。什么是TP?这是一个为您定制的Salesforce开发版组织,可用于Trailhead。您可以启动一个TP,或创建一个新的TP,从任何动手挑战。现在就创建一个新的TP(使用现有的组织可能在检查挑战时产生问题)。滚动到此页面的底部。单击“启动”旁边的向下箭头,然后选择创建Trailhead Playground(需要登录)。如果您需要新TP的登录凭据,请按照本文中的说明进行操作。

Lightning-数据服务(1)

学习目标

注意,开拓者!

Salesforce有两个不同的桌面用户界面:Lightning Experience和Salesforce Classic。这个模块是为Lightning Experience设计的。

您可以在Trailhead的“Lightning Experience Basics”模块中了解如何在接口之间切换,启用Lightning Experience以及其他功能。

完成本单元后,您将能够:

  • 描述什么是闪电数据服务。
  • 解释Lightning Data Service如何提高组件的性能。
  • 使用Lightning Data Service将记录加载到用户界面中。

什么是闪电数据服务?

我们建立了Lightning Data Service(LDS)作为Lightning的数据层。 LDS是Visualforce标准控制器的Lightning Components对应部件,可以访问页面上显示的数据。没有LDS,即使应用程序中的所有组件都从相同的记录数据中提取,应用程序中的每个组件都会独立调用服务器来对记录执行CRUD操作。每个服务器调用都会降低性能,使用户不必处理数据,而是用拇指旋转。这些独立的服务器调用也可能导致不一致,从而导致服务器调用刷新一个组件,使其他组件过期的情况。

闪电数据服务识别并消除涉及相同记录数据的请求,发送单个共享数据请求以更新所有相关组件。这不仅消除了组件间不一致的数据,而且还提供了一种方法来缓存数据以便在用户断开连接的情况下脱机工作,并在连接恢复后智能地同步数据。

Animation showing an application that uses Lightning Data Service to populate its components

这个gif显示了一个使用Lightning Data Service来编辑和更新组件的属性管理应用程序。状态更新后,销售状态进度栏会自动更新属性的详细信息。

Animation showing an application that uses Lightning Data Service to populate its components

这个gif显示了同一个页面中的第二个组件,它创建和显示父记录的约会。

简而言之,Lightning Data Service提供可重复使用的Aura组件:

  • 最小化XMLHttpRequests(XHR)
  • 取一次记录,减少网络传输,应用程序服务器负载和数据库服务器负载
  • 在客户端缓存记录数据,与组件元数据分开
  • 在组件间共享记录数据
  • 启用渐进式记录加载,缓存以及将更多字段和布局合并到缓存中
  • 启用主动式缓存填充
  • 通过在多个组件中仅使用一个记录数据实例来提高一致性
  • 记录数据更改时创建通知

如果您有Lightning应用程序创建,读取,更新或删除记录,则LDS是执行CRUD操作的最佳,最有效的方法。

LDS在这里简化你的生活。采用LDS意味着您不再需要编写自己的控制器代码。所有的数据访问代码都包含在LDS组件中,大大降低了应用程序和页面的复杂性。这种复杂性降低意味着您不必在性能和质量测试上花费太多时间。想想你可以节省的周期!

碰到force:recordData

那么你如何获得闪电数据服务的好处呢?简单!你所要做的就是在你的组件中包含force:recordData。好的,除此之外还有一点点,所以让我们来看一个基本的用例。

LDS最简单的用途之一是加载记录。要在客户端加载记录,必须将force:recordData标记添加到组件,并设置recordId,mode和layoutType或fields属性。

  • recordId 指定要加载的记录。记录不能没有recordId加载。
  • 模式可以设置为编辑或视图,这决定了通知的行为以及可以使用记录执行哪些操作。如果您使用force:recordData以任何方式更改记录,请将模式设置为EDIT。
  • layoutType 指定用于显示记录的布局(FULL或COMPACT)。
  • fields 指定要查询的记录中的哪些字段。必须提供字段或layoutType属性(或两者)

force:recordData标签还支持一组target *属性,这些属性是force:recordData填充自身。目标*属性可以用来允许从UI进行访问。

  • targetRecord 被装载的记录填充
  • targetFields 填充了加载记录的简化视图
  • targetError被填充任何错误
<force:recordData aura:id="forceRecordCmp" 
  <!-- aura:id is required to reference the component in your Javascript controller -->
    recordId="{!v.recordId}"
    layoutType="{!v.layout}"
    fields="{!v.fieldsToQuery}"
    mode="VIEW"
    targetRecord="{!v.record}"
    targetFields="{!v.simpleRecord}" 
    targetError="{!v.error}"
/>
force:recordData自身不包含任何UI元素;这只是逻辑和与服务器通信的一种方式。使用其他组件显示强制获取的数据:recordData。在这个例子中,lightning:formattedtext显示了由force:recordData加载的记录中的Name字段。
<aura:component>

    <aura:attribute name="recordId" type="String" />
    <aura:attribute name="record" type="Object" />
    <aura:attribute name="simpleRecord" type="Object" />

     <force:recordData recordId="{!v.recordId}"
          targetRecord ="{!v.record}"
          targetFields ="{!v.simpleRecord}"
          fields="Id, Name"/>

    <div class="recordName">
        <p class="slds-text-heading--medium">
            <lightning:formattedtext title="Record Name" value="{!v.simpleRecord.Name}"></p>
    </div>

</aura:component>
有几种灵气方法可以修改记录。以下简要介绍一下您可以在JavaScript组件控制器中使用的方法。
  • saveRecord()插入或更新加载到force:recordData组件的记录。
  • deleteRecord()删除加载的记录。
  • getNewRecord()加载保存时执行插入的新记录模板。
  • reloadRecord()重载加载代码,用当前的属性值覆盖当前的targetRecord。

我们将在下一个单元详细介绍如何使用这些Aura方法。