インライン編集を使用したテーブルでのデータの表示

テーブルで Salesforce データを表示するには、lightning-datatable コンポーネントを使用します。このコンポーネントはインライン編集をサポートするため、ユーザはレコードに移動せずに項目値を更新できます。

レコードのリストを読み込むには、getListUi (Deprecated) ワイヤアダプタを使用するか、Apex メソッドで SOQL を使用します。「データガイドライン」を参照してください。

次の例では、Apex メソッドで SOQL を使用して取引先レコードの取引先責任者を読み込んでいます。

@AuraEnabled(cacheable=true) アノテーションは、メソッドを Lightning コンポーネントに公開し、クライアント上の取引先責任者のリストをキャッシュします。accId パラメータを使用して、特定の取引先レコードの取引先責任者を絞り込みます。

LWC Recipes サンプルアプリケーションで緑色のバナーとして表示されているトースト通知。

Apex メソッドがデータを返すと、HTML テンプレートは編集可能な名項目と姓項目 (1) が含まれる lightning-datatable コンポーネントを表示します。項目を編集すると、[保存] ボタンが表示されます。このボタンをクリックして、取引先責任者レコードを更新できます。取引先責任者レコードが正常に更新されると、関連リスト (2) のレコードデータや、Lightning データサービスで管理されているページの他のコンポーネントも更新されます。

この例は、lwc-recipes リポジトリの datatableInlineEditWithUiApi コンポーネントに基づいています。このバージョンは、データテーブルをレコードページで使用できるようにするために若干異なっています。

インライン編集を有効にするには、次の apexContactsForAccount テンプレートのように lightning-datatable コンポーネントを設定します。

必須の key-field 属性は、各行を取引先責任者レコードに関連付けます。data 属性は、ワイヤサービスによって Apex メソッドまたはワイヤアダプタから取得されたデータを保持します。columns 属性は、レコード項目を各列に割り当てて、列の動作をカスタマイズします。ユーザがセルを編集すると、更新された値が draft-values に格納されます。

[保存] ボタンをクリックすると save イベントがトリガされます。onsave イベントハンドラを使用して、変更内容をデータテーブルに格納します。この例では、onsave イベントハンドラが updateRecord(recordInput, clientOptions) をコールして、レコードの変更を保存します。

属性とサポートされる機能のリストは、lightning-datatable を参照してください。

1 行のデータは 1 つのレコードに対応し、各列にはそのレコードの項目の 1 つの値が表示されます。インライン編集を有効にするには、列定義で editable: true を設定することで編集できる項目を指定します。この例では、First Name 項目と Last Name 項目は編集可能です。取引先責任者の名前項目は複合項目であるため、First Name 項目と Last Name 項目を使用する必要があります。

@wire(getContacts) は、データを contacts.data に、レコード ID を accId にプロビジョニングします。

項目を編集すると、編集後の項目値とレコード Id がオブジェクトの配列として event.detail.draftValues に格納されます。

変更後に Tab キーを押すかセルの外側をクリックすると、データテーブルのフッターに [キャンセル] ボタンと [保存] ボタンが表示されます。データベースフッタを非表示にするには、draftValues プロパティをクリアします。onsave イベントハンドラは、値をレコードオブジェクトにコピーした後に draftValues をクリアします。

updateRecord(recordInput, clientOptions) をコールすることで、新しい項目値がレコードに保存されます。

updateRecord() は、1 つのレコードのみを想定します。項目を更新する各レコードに対して recordInput オブジェクトを渡します。この例では、record パラメータに複数レコードの更新済み項目が格納されたオブジェクトが含まれます。複数のレコードを同時に更新するには、パラメータを updateRecord() に渡して処理します。

保存に成功すると、onsave イベントハンドラで ShowToastEvent イベントがディスパッチされ、成功トーストメッセージが表示されます。

レコードが更新されると、refreshApex(this.contacts) は、Apex メソッドから返された取引先責任者のリストを更新し、データテーブルが常に最新のデータを反映するようにします。

1 つのトランザクションでレコードを一括更新するには、Apex を使用することをお勧めします。**「Apex を使用したのインライン編集の有効化」**セクションを参照してください。

レコードを一括更新する場合、update データ操作言語 (DML) 操作をコールする Apex コントローラにレコードの変更内容を渡します。この例では、編集された項目値が updateContacts Apex コントローラに渡されます。レコードは Apex によって更新されるため、ユーザは notifyRecordUpdateAvailable(recordIds) 関数を使用して Lightning データサービス (LDS) に通知し、Lightning データサービスキャッシュおよびワイヤが更新されるようにする必要があります。

この例は、github.com/trailheadapps/lwc-recipes リポジトリの datatableInlineEditWithApex コンポーネントに基づいています。このバージョンは、LDS を使用せずに Apex を使用するという点で若干異なっています。

前の例で作成した apexContactsForAccount.js ファイルで、Apex コントローラと notifyRecordUpdateAvailable 関数をインポートします。

handleSave() 関数を更新して、編集された値を処理します。レコードの更新後に Apex を介して notifyRecordUpdateAvailable() がコールされるようにするには、async/await パターンまたは Promise チェーンを使用します。次の例では async/await を使用します。

updateContacts Apex コントローラは、更新された項目が含まれる JSON 文字列を取引先責任者オブジェクトにデシリアライズします。update DML 操作を使用して、変更されたレコードを更新します。

関連トピック