見出し画像

Lightning Web ComponentsからApexクラスにJSONデータを受け渡す方法

Lighting Web Componentsで、一覧形式で編集できる画面を作った場合、複数の項目を、配列で渡したいことってありませんか?

複数の項目を渡すには、項目ごとのパラメータを準備すればOKです。

更新するデータ量が100個以内であれば、パラメータにして必要な回数分、Apexクラスのメソッドを呼び出せば大丈夫です。

100個を超えるとどうなるか・・・。

そうです。SOQLを101回以上コールしたというガバナ制限にひかかります。

これを回避するためには、Lightning Web ComponentsからApexクラスに一度にデータを受け渡す必要があります。

Lightning Web Componentsは、Javascriptなので、JSONが扱えるようにすると便利です。

そこで、ApexクラスにJSONデータを渡してみようと思います。JSONデータはもちろん配列です。

Lightning Web Component側

Lighting Web Components側の実装は、以下の通りです。JSONデータを作って、Apexクラスのメソッドをコールするだけです。1点、JSON.stringifyを使うのを忘れないようにしてください。

import { LightningElement, track } from 'lwc';
import setParam from '@salesforce/apex/ArrayParam.setParam';

export default class ArrayParam extends LightningElement {
   @track
   result;

   handleClick() {
       const param = [
           { intParam: 1, boolParam: true, strParam: 'ABC' },
           { intParam: 2, boolParam: false, strParam: 'DEF' }
       ];

       setParam({param: JSON.stringify(param)})
       .then(result => {
           this.result = result;
       })
       .catch(error => {
           /*eslint no-console: "off"*/
           console.log(error);
           this.result = error;
       })
   }
}

Apexクラス側

Apexクラス側は、パラメータをStringで受けます。そのパラメータをJSON.deserializeUntypedで解析します。

配列のJSONですので、復帰値はList<Object>になります。ヘルプにはMap<String, Object>とありますが、配列のJSONの場合はList<Object>です。

返って来たList<Object>の一つ一つが、Map<String, Object>になります。

このサンプルでは、3つの項目を渡しています。intParamはInteger型、boolParamはBoolean型、strParamはString型になっています。

get('intParam')で値を取得するとInteger型になりますので、(Integer)とキャストして使いましょう。

public with sharing class ArrayParam {
   @AuraEnabled
   public static string setParam(string param){
       string result = '';

       List<Object> lm = (List<Object>)JSON.deserializeUntyped(param);

       for(Integer i=0 ; i<lm.size() ; i++) {
           Map<String, Object> m = (Map<String, Object>)lm[i];
           result += '[ \r\n';
           result += '{' + (Integer)m.get('intParam') + ',' + (Boolean)m.get('boolParam') + ',' + (String)m.get('strParam') + '}\r\n';
           result += '], \r\n';
       }

       return result;
   }
}

これで、Lighting Web Componentsから複数の項目を配列として受け渡すことができます。

プロジェクト全体のソースコードはこちらにあります。


この記事が気に入ったらサポートをしてみませんか?