メインコンテンツへスキップ
見出し画像

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から複数の項目を配列として受け渡すことができます。

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


     
     
    生涯現役なデベロッパーを目指しています。Typescript、Javascript、Salesforceのフルスタックデベロッパーとして日々コードを綴っています。コードを綴る中で、「これは!?」と思ったものを記事にしています。

    あなたへのおすすめ