レコードの編集
lightning:recordForm を使用したレコードの編集
lightning:recordForm を使用してレコードを編集するには、レコード ID とオブジェクト API 名を指定します。レコード ID を指定した場合は、view モードがこのコンポーネントのデフォルトモードとなり、項目に編集アイコンが表示されます。編集アイコンをクリックすると、すべての項目が編集可能になります。
次の例では、編集アイコンをクリックすると取引先レコードの項目が更新可能になるフォームを作成しています。2 列のコンパクトレイアウトで項��を表示します。このコンポーネント例を、取引先レコードページに追加します。コンポーネントは、force:hasRecordId によってレコード ID を継承します。
1<aura:component implements="flexipage:availableForRecordHome, force:hasRecordId">
2 <lightning:recordForm
3 recordId = "{!v.recordId}"
4 objectApiName="Account"
5 layoutType="Compact"
6 columns="2" />
7</aura:component>レコードが正常に保存されると、項目値が変更されたすべてのコンポーネントが自動的に更新されます。
フォームに mode="edit" を追加して、編集用の入力項目を表示するようにフォームを変更します。フォームには、レコードを更新するための [保存] ボタンと、変更内容を破棄するための [キャンセル] ボタンがあります。
1<aura:component implements="flexipage:availableForRecordHome, force:hasRecordId">
2 <lightning:recordForm
3 recordId = "{!v.recordId}"
4 objectApiName="Account"
5 layoutType="Compact"
6 mode="edit" />
7</aura:component>lightning:recordForm でのエラー処理のカスタマイズ
レコードが正常に保存された場合の動作をカスタマイズするには、onsuccess イベントハンドラを使用します。エラーは自動的に処理されて表示されます。エラーの処理をカスタマイズするには、onerror イベントハンドラを使用します。
1<aura:component implements="flexipage:availableForRecordHome, force:hasRecordId">
2
3 <!-- Displays a toast notification -->
4 <lightning:notificationsLibrary aura:id="notifLib" />
5 <lightning:recordForm
6 recordId = "{!v.recordId}"
7 objectApiName="Account"
8 layoutType="Compact"
9 mode="edit"
10 onsuccess="{!c.handleSuccess}"
11 onerror="{!c.handleError}"/>
12</aura:component>レコードが正常に保存されるか、または保存中にエラーが発生すると、トースト通知が表示されます。
1({
2 handleSuccess: function (cmp, event, helper) {
3 cmp.find('notifLib').showToast({
4 "title": "Record updated!",
5 "message": "The record "+ event.getParam("id") + " has been updated successfully.",
6 "variant": "success"
7 });
8 },
9
10 handleError: function (cmp, event, helper) {
11 cmp.find('notifLib').showToast({
12 "title": "Something has gone wrong!",
13 "message": event.getParam("message"),
14 "variant": "error"
15 });
16 }
17})lightning:recordEditForm を使用したカスタムレイアウトレコードの編集
フォーム項目のカスタムレイアウトを指定するには、lightning:recordEditForm コンポーネントを使用します。
レコード項目種別に基づいて入力コントロールを表示する lightning:inputField に項目を渡します。
次の例では、カスタムレイアウトを使用した、2 つの項目を持つフォームを表示しています。このコンポーネント例を、取引先レコードページに追加します。
1<aura:component implements="flexipage:availableForRecordHome, force:hasRecordId">
2 <lightning:recordEditForm
3 recordId="{!v.recordId}"
4 objectApiName="Account">
5 <lightning:messages />
6 <div class="slds-grid">
7 <div class="slds-col slds-size_1-of-2">
8 <lightning:inputField fieldName="Name"/>
9 </div>
10 <div class="slds-col slds-size_1-of-2">
11 <lightning:inputField fieldName="Industry"/>
12 </div>
13 </div>
14 <lightning:button class="slds-m-top_small" type="submit" label="Create new" />
15 </lightning:recordEditForm>
16</aura:component>サーバエラーが発生すると、lightning:recordEditForm は lightning:messages コンポーネントを使用して、フォーム項目の上にエラーメッセージを表示します。もしくは、onerror イベントハンドラを使用して、エラー処理方法を定義します。
lightning:recordForm にはなくて lightning:recordEditForm だけにある、もう 1 つの機能は、次のセクションで説明するカスタム項目値でのフォームの表示です。
項目値の事前読み込み
フォームの表示時にカスタム項目値を表示するには、lightning:inputField で value 属性を使用します。レコード ID を事前に読み込む場合、レコードを読み込んだときに返される レコード ID によってカスタム値が上書きされることはありません。
あるいは、項目値を次の構文で設定します。
1cmp.find("nameField").set("v.value", "My New Account Name");レコードの作成時に lightning:recordForm や lightning:recordEditForm では行えないカスタマイズが必要な場合には、force:recordData の使用を検討してください。
force:recordData を使用したカスタムユーザインターフェース経由でのレコードの編集
- 変更を既存のレコードに保存する場合
- 新しいレコードを作成して保存する場合
変更を既存のレコードに保存するには、レコードを EDIT モードで読み込み、force:recordData コンポーネントの saveRecord をコールします。
新しいレコードを保存するには作成する必要があるため、「レコードの作成」に記載のとおり、レコードテンプレートからレコードを作成します。次に、force:recordData コンポーネントの saveRecord をコールします。
EDIT モードのレコードの読み込み
saveRecord のコールによるレコードの変更の保存
保存操作を実行するには、適切なコントローラアクションハンドラから、force:recordData コンポーネントの saveRecord をコールします。saveRecord メソッドは、操作の完了時に呼び出されるコールバック関数という 1 つの引数を取ります。このコールバック関数は、その唯一のパラメータとして SaveRecordResult オブジェクトを受け取ります。SaveRecordResult には、操作の成否や、結果の処理に使用できるその他の詳細を示す state 属性が含まれます。
レコードの保存
次の例は、Lightning データサービスを使用したレコードの保存の要点を示しています。この例は、レコードページで使用されることを意図しています。レコード ID は、force:hasRecordId インターフェースによって追加される暗黙的な recordId 属性によって指定されます。
1<aura:component implements="flexipage:availableForRecordHome,force:hasRecordId">
2
3 <aura:attribute name="record" type="Object"/>
4 <aura:attribute name="simpleRecord" type="Object"/>
5 <aura:attribute name="recordError" type="String"/>
6
7 <force:recordData aura:id="recordHandler"
8 recordId="{!v.recordId}"
9 layoutType="FULL"
10 targetRecord="{!v.record}"
11 targetFields="{!v.simpleRecord}"
12 targetError="{!v.recordError}"
13 mode="EDIT"
14 recordUpdated="{!c.handleRecordUpdated}"
15 />
16
17 <!-- Display a lightning card with details about the record -->
18 <div class="Record Details">
19 <lightning:card iconName="standard:account" title="{!v.simpleRecord.Name}" >
20 <div class="slds-p-horizontal--small">
21 <p class="slds-text-heading--small">
22 <lightning:formattedText title="Billing State" value="{!v.simpleRecord.BillingState}" /></p>
23 <p class="slds-text-heading--small">
24 <lightning:formattedText title="Billing City" value="{!v.simpleRecord.BillingCity}" /></p>
25 </div>
26 </lightning:card>
27 </div>
28
29 <!-- Display an editing form -->
30 <div class="Record Details">
31 <lightning:card iconName="action:edit" title="Edit Account">
32 <div class="slds-p-horizontal--small">
33 <lightning:input label="Account Name" value="{!v.simpleRecord.Name}"/>
34 <br/>
35 <lightning:button label="Save Account" variant="brand" onclick="{!c.handleSaveRecord}" />
36 </div>
37 </lightning:card>
38 </div>
39
40 <!-- Display Lightning Data Service errors, if any -->
41 <aura:if isTrue="{!not(empty(v.recordError))}">
42 <div class="recordError">
43 {!v.recordError}</div>
44 </aura:if>
45</aura:component>1({
2 handleSaveRecord: function(component, event, helper) {
3 component.find("recordHandler").saveRecord($A.getCallback(function(saveResult) {
4 // use the recordUpdated event handler to handle generic logic when record is changed
5 if (saveResult.state === "SUCCESS" || saveResult.state === "DRAFT") {
6 // handle component related logic in event handler
7 } else if (saveResult.state === "INCOMPLETE") {
8 console.log("User is offline, device doesn't support drafts.");
9 } else if (saveResult.state === "ERROR") {
10 console.log('Problem saving record, error: ' + JSON.stringify(saveResult.error));
11 } else {
12 console.log('Unknown problem, state: ' + saveResult.state + ', error: ' + JSON.stringify(saveResult.error));
13 }
14 }));
15 },
16
17 /**
18 * Control the component behavior here when record is changed (via any component)
19 */
20 handleRecordUpdated: function(component, event, helper) {
21 var eventParams = event.getParams();
22 if(eventParams.changeType === "CHANGED") {
23 // get the fields that changed for this record
24 var changedFields = eventParams.changedFields;
25 console.log('Fields that are changed: ' + JSON.stringify(changedFields));
26 // record is changed, so refresh the component (or other component logic)
27 var resultsToast = $A.get("e.force:showToast");
28 resultsToast.setParams({
29 "title": "Saved",
30 "message": "The record was updated."
31 });
32 resultsToast.fire();
33
34 } else if(eventParams.changeType === "LOADED") {
35 // record is loaded in the cache
36 } else if(eventParams.changeType === "REMOVED") {
37 // record is deleted and removed from the cache
38 } else if(eventParams.changeType === "ERROR") {
39 // there’s an error while loading, saving or deleting the record
40 }
41 }
42})ページ上で force:recordData のインスタンスを複数作成する場合は、saveRecord ハンドラと recordUpdated ハンドラを必要なだけ使用してください。たとえば、同じレコードを更新する force:recordData のインスタンスを 2 つ作成する場合には、各インスタンスに異なる aura:id を割り当てることで、saveRecord とそれに続く recordUpdated ハンドラが一意に呼び出されるようにします。