命令としての Apex メソッドのコール
メソッド呼び出しのタイミング (ボタンのクリックに対応するなど) を制御するには、命令としてメソッドをコールします。命令としてメソッドをコールすると、1 つの応答のみを受け取ります。フレームワークに制御を委任し、値のストリームがプロビジョニングされる @wire と、この動作を比較します。
次のシナリオでは、@wire を使用せずに命令としてメソッドを Apex コールする必要があります。
- データを挿入、更新、削除するメソッドが含まれる、
cacheable=trueが付加されていないメソッドをコールする。 - 呼び出しのタイミングを制御する。
- ユーザインターフェース API でサポートされていないオブジェクト (ToDo や行動など) を操作する。
LightningElementを拡張しない ES6 モジュールのメソッドをコールする。
Apex メソッドが @AuraEnabled(cacheable=true) でマークされている場合、ネットワークコールを発行してサーバの Apex メソッドを呼び出す前にクライアント側の Lightning データサービスキャッシュがチェックされます。ただし、Apex によってプロビジョニングされるデータは Lightning データサービスでは管理されません。したがって、古いデータを更新するには、Apex メソッドを呼び出してから notifyRecordUpdateAvailable(recordIds) をコールし、Lightning データサービスキャッシュを更新します。
前の例と同じ getContactList クラスを使用する、lwc-recipes リポジトリのサンプルコンポーネントを見てみましょう。このクラスを結び付けるのではなく、ユーザがボタンをクリックしたときにコンポーネントで getContactList() をコールします。
![[Load Contacts (取引先責任者を読み込む)] ボタンと、その下に表示された取引先責任者のリスト。](https://a.sfdcstatic.com/developer-website/sfdocs/lwc/media/apex_imperative.png)
インポートされた関数は Promise を返します。このコードは一連のパラメータを前提として 1 回限りの解決策を提供しますが、@wire(apexMethod) は値のストリームを提供し、動的パラメータをサポートします。
このテンプレートは lwc:if を使用して、取引先責任者のリストまたはエラーパネルを表示します。また、for:each を使用して、取引先責任者を反復処理します。
Apex メソッドにパラメータ値を渡すには、Apex メソッドのパラメータと一致するプロパティを持つオブジェクト内でパラメータ値を渡します。たとえば、Apex メソッドが文字列パラメータを取る場合、文字列を直接渡さず、値が文字列であるプロパティを含むオブジェクトを渡します。
![検索項目に文字を入力し、[検索] をクリックすると、取引先責任者のリストが返されます。](https://a.sfdcstatic.com/developer-website/sfdocs/lwc/media/apexImperativeWithParams.png)
lwc-recipes リポジトリには、パラメータを使用してメソッドをコールする apexImperativeMethodWithParams コンポーネントもあります。オブジェクトパラメータを使用してメソッドをコールするには、apexImperativeMethodWithComplexParams コンポーネントを参照してください。
レコードデータなどの値を LWC から Apex に渡すときは、JavaScript オブジェクトまたは配列を使用します。Apex メソッドに渡されるときに、対応付けの値はシリアライズされません。
命令 Apex コールおよび結び付けられた Apex コールでは、対応付けの使用はサポートされていません。map[key] = val などで対応付けを不適切に使用すれば、LWS を無効にしてデータを渡すことができました。しかし、LWS が有効のときは、このような方法は使用できなくなりました。また、Apex に値を渡す場合、map.set(key, val) はサポートされません。
JavaScript オブジェクトを次のように使用することができます。
関連トピック