Salesforce データの操作
学習の目的
- 基本コンポーネントを使用して、1 つのレコードを処理するフォームを作成する。
- ワイヤーサービスを使用してデータを取得する。
- データを作成して更新する。
- Apex メソッドをコールする。
データのないコンポーネントは見た目がすっきりしているかもしれませんが、空っぽに感じられます。この単元では、こうした空虚感を埋め、Aura コンポーネントと Lightning コンポーネントの Salesforce データの読み取り方法と書き込み方法を比較します。
Aura コンポーネントの Apex クラスを開発している場合は、Lightning Web コンポーネントでも Apex を再利用できます。ただし、Lightning Web コンポーネントにはデータを処理する別の手段が用意されているため、開発した Apex が不要になる場合もあります。
1 つのレコードを処理するフォームの作成
ユーザーが Salesforce レコードを表示、編集、作成できるフォームを作成する場合、Aura コンポーネントと Lightning Web コンポーネントのどちらも lightning 名前空間で基本コンポーネントを使用します。
これらのコンポーネントにはフォームレイアウトがあり、レコードの CRUD 変更が処理されるため、Apex コードを記述する必要がありません。Lightning データサービスを使用して、レコードの更新をキャッシュし、コンポーネント間で共有します。
Lightning データサービスは公開ユーザーインターフェース API 上に構築されていますが、API のサブセットしかサポートしていません。このサブセットが、データを処理する一般的なユースケースの多くに対処します。
Aura コンポーネントと Lightning Web コンポーネントでは、動作は同じですが、前述のとおり命名規則が異なります。
Form 関数 | Aura コンポーネント | Lightning Web コンポーネント |
---|---|---|
編集、表示、参照のみモードをサポート | lightning:recordForm | lightning-record-form |
参照のみのフォーム | lightning:recordViewForm | lightning-record-view-form |
編集可能なフォーム | lightning:recordEditForm | lightning-record-edit-form |
大半のユースケースでは、lightning-record-form から始めるとよいでしょう。このコンポーネントには lightning-record-view-form と lightning-record-edit-form の機能が結合され、簡単に使えるようになっています。
カスタム項目レイアウトやレコードデータのカスタム表示を要する高度なユースケースでは lightning-record-view-form と lightning-record-edit-form を使用します。
以下は、BrokerDetails Aura コンポーネントの例です。
以下は、対応する brokerCard Lightning コンポーネントの HTML です。
1 つのレコードを処理するカスタム UI
Aura コンポーネントで lightning:recordForm や同様の関数よりも UI に対する管理を強化する必要がある場合は、マークアップの独自のカスタム UI に <force:recordData> タグを使用できます。
PropertySummary Aura コンポーネントでは、マークアップに <force:recordData> を使用しています。
Lightning Web コンポーネントについては、<force:recordData> の代わりに、Lightning データサービスを使用するいくつかの技法が用意されていますが、データを読み込んでいるのか書き込んでいるのかによって使用する技法が異なります。ワイヤーサービスや JavaScript API のメソッドは、lightning-record-*-form コンポーネントが各自の要件を満たさない場合にのみ使用を検討します。
ワイヤーサービスを使用したデータの取得
Lightning Web コンポーネントでは、Salesforce データを読み取るために、Lightning データサービス上に構築されたリアクティブなワイヤーサービスを使用します。コンポーネントは JavaScript クラスの @wire を使用して、lightning/ui*Api 名前空間のいずれかのワイヤーアダプターからデータを読み取ります。Salesforce が提供するワイヤーアダプターのリストについては、この単元の「リソース」セクションを参照してください。独自のカスタムワイヤーアダプターを記述することはできません。
このワイヤーサービスをリアクティブと呼ぶ理由の 1 つは、$ というプレフィックスが付いたリアクティブ変数をサポートしているためです。リアクティブ変数が変更されると、ワイヤーサービスが新しいデータをプロビジョニングします。「要求」や「取得」ではなく「プロビジョニング」と言うのは、データが提供されたときに、そのデータをコンポーネントではなく、ワイヤーアダプターが管理するためです。
以下は、@wire を使用してレコードを取得する propertySummary.js の例です。
このコードは lightning/uiRecordApi から getRecord ワイヤーアダプターをインポートします。
ui*Api ワイヤーアダプターを使用する場合は、オブジェクトや項目への参照をインポートすることを強くお勧めします。オブジェクトや項目への参照をインポートすると、オブジェクトや項目が存在することを Salesforce が検証するため、コードが確実に機能します。次のコードの行は、Property カスタムオブジェクトの Name 項目への参照をインポートします。
@api デコレーターは recordId プロパティを公開します。propertySummary を含む親コンポーネントは、その HTML ファイルの record-id 属性の値を設定します。
$recordId は先頭に $ が付いているため、その値が変更されると、ワイヤーサービスが新しいデータを取得してコンポーネントにプロビジョニングします。新しいデータが提供されると、結び付けられている関数が呼び出されます。このプロセスがプロパティを更新し、それによって再表示が行われます。
wiredRecord 関数が、このワイヤーサービスからデータのストリームを受信します。そしてレコードデータが data 引数に返されます。エラーがある場合は error 引数に返されます。
JavaScript API メソッドを使用したデータの書き込み
createRecord JavaScript API はレコードを作成します。また、updateRecord や deleteRecord を使用することもできます。私たちは今なお内部で Lightning データサービスを使用しているため、Apex は必要ありません。
以下は、createRecord を使用して取引先を作成する ldsCreateRecord Lightning Web コンポーネントです。
createRecord が、レコードが正常に作成されると解決する Promise オブジェクトを返します。JavaScript API についての詳細は、この単元の末尾の「リソース」を参照してください。
ldsCreateRecord の HTML ファイルに、JavaScript ファイルの createAccount() を呼び出すボタンが含まれます。取引先名が lightning-input コンポーネントに設定されます。
カスタムデータへのアクセスでの Apex の使用
Lightning データサービスを使用してデータを処理する技法をいくつか見てきました。これらの技法は Apex を必要としないため、通常はコードが少なくてすみます。けれども、すでに Aura コンポーネント用に開発した Apex コードがある場合は、そのコードを Lightning Web コンポーネントでも再利用できます。また、カスタムデータにアクセスするために SOQL クエリが必要な場合は、Apex メソッドを使用する必要があります。
Aura コンポーネントから Apex コントローラーにアクセスするには、JavaScript コントローラーまたはヘルパーからコールを実行します。以下は、getPictures() Apex メソッドをコールする PropertyCarousel Aura コンポーネントのヘルパーです。
Salesforce データにアクセスするどの Aura コンポーネントにも同様の定型コードがあります。Apex メソッドにアクセスする構文は、Lightning Web コンポーネントの場合とは異なります。
Lightning Web コンポーネントは Apex クラスからメソッドをインポートできます。インポートされたメソッドは、コンポーネントが @wire を使用して宣言的に、あるいはコードで直接コールできる関数です。
Apex メソッドの Lightning Web コンポーネントへの公開
Apex メソッドを Lightning Web コンポーネントに公開するには、メソッドが static で、かつ global または public のいずれかである必要があります。メソッドに @AuraEnabled アノテーションを付加します。こうした要件は、Aura コンポーネントで Apex メソッドを使用する場合と同じです。@AuraEnabled アノテーションは、Aura コンポーネントまたは Lightning Web コンポーネントからメソッドをコールできることを意味します。Lightning Web コンポーネントでの @AuraEnabled の使用は意外なように思えるかもしれませんが、このアノテーションを使用することで、同じ Apex コードを両方のプログラミングモデルで使用できるようになります。
ワイヤーサービスを使用した Apex メソッドのコール
Apex メソッドがキャッシュ可能で (データを変更しない) 場合は、ワイヤーサービスを使用してコンポーネントから呼び出すことができます。このメソッドには @AuraEnabled(cacheable=true) アノテーションを付加する必要があります。
getAccounts() メソッドを指定した MyAccountController Apex コントローラーを見てみましょう。
この JavaScript コードは、ワイヤーサービスを使用して Apex getAccounts() メソッドをコールします。
getAccounts をインポートするステートメントの構文に注意します。
- MyAccountController は Apex クラスの名前です。
- getAccounts はインポートする @AuraEnabled メソッドです。
外部 API の使用
Lightning Web コンポーネントでの外部 API の使用は、Aura コンポーネントと同様です。デフォルトでは、Lightning Web コンポーネントの JavaScript コードからサードパーティの API にコールを実行することはできません。リモートサイトを CSP 信頼済みサイトとして追加し、JavaScript コンポーネントのコードがアセットを読み込み、そのサイトのドメインに API 要求を実行できるようにします。
サードパーティのサイトからの JavaScript コードの実行については、Aura コンポーネントも Lightning Web コンポーネントも制限は同じです。サードパーティのライブラリを使用するには、そのライブラリを静的リソースとしてアップロードする必要があります。
リソース
- Lightning Aura Components Developer Guide (Lightning Aura コンポーネント開発者ガイド): Calling a Server-Side Action (サーバー側のアクションのコール)
- Lightning Aura Components Developer Guide (Lightning Aura コンポーネント開発者ガイド): Manage Trusted URLs (信頼済み URL の管理)
- Lightning Aura Components Developer Guide (Lightning Aura コンポーネント開発者ガイド): Using External JavaScript Libraries (外部 JavaScript ライブラリの使用)
- Lightning Web Components Developer Guide (Lightning Web コンポーネント開発者ガイド): Work with Salesforce Dat (Salesforce データの操作)
- Lightning Web Components Developer Guide (Lightning Web コンポーネント開発者ガイド): Create a Form To Work with Records (レコードを処理するフォームの作成)
- Lightning Web Components Developer Guide (Lightning Web コンポーネント開発者ガイド): lightning/ui*Api Wire Adapters and Functions (lightning/ui*Api ワイヤーアダプターと関数)
- Lightning Web Components Developer Guide (Lightning Web コンポーネント開発者ガイド): createRecord(recordInput)