【Salesforce】Visualforceでページから値が帰ってこない
Salesforceで画面の開発をしていました。
しかし、apexの変数に対してvisualforce画面から値を入力しても値が入ってこないということがありました。
確認用に書いたコードです。
コントローラ側
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** * GET SET 確認 */ public with sharing class GetSetCheckController { // 実験対象 public String str{get;set;} /** * コンストラクタ * 値の初期化を行う */ public GetSetCheckController (){ str = ''; } /** * 固定の文字列リストを取得する */ public List<String> getStringList(){ return new List<String>{'aaa', 'bbb', 'ccc'}; } } |
ページ側
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<apex:page id="Page" controller="GetSetCheckController" > <apex:form id="Form" > <!-- index --> <apex:variable value="{!1}" var="index" /> <!-- 固定文字列リストの繰り返し --> <apex:repeat value="{!StringList}" var="tmpString" > <apex:outputPanel layout="block" > <!-- 固定文字列 --> <apex:outputLabel value="{!tmpString}" /> <!-- get set用の変数 --> <apex:inputText value="{!str}" rendered="{!index == 1}" /> </apex:outputPanel> <!-- indexの更新 --> <apex:variable value="{!index + 1}" var="index" /> </apex:repeat> <!-- 画面を更新するためのボタン --> <apex:outputPanel layout="block" > <apex:commandButton value="ボタン" rerender="Form" /> </apex:outputPanel> </apex:form> </apex:page> |
固定のリストを表示して、1つ目の値のときにコントローラの入力用変数を表示しています。
ボタンでは画面のリフレッシュを行っています。
こんな感じの画面です。
画面に表示されているinputに値を入力してボタンを押下すると、画面が更新されたときに値がリセットされてしまいます。
変数は1つしかないので、上書きされているとは思えません。
繰り返しの外側に設置すると、当然ではありますが値が残ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<apex:page id="Page" controller="GetSetCheckController" > <apex:form id="Form" > <!-- index --> <apex:variable value="{!1}" var="index" /> <!-- 固定文字列リストの繰り返し --> <apex:repeat value="{!StringList}" var="tmpString" > <apex:outputPanel layout="block" > <!-- 固定文字列 --> <apex:outputLabel value="{!tmpString}" /> </apex:outputPanel> <!-- indexの更新 --> <apex:variable value="{!index + 1}" var="index" /> </apex:repeat> <!-- get set用の変数 --> <apex:inputText value="{!str}"/> <!-- 画面を更新するためのボタン --> <apex:outputPanel layout="block" > <apex:commandButton value="ボタン" rerender="Form" /> </apex:outputPanel> </apex:form> </apex:page> |
繰り返しの中で起こる現象のようです。
コントローラのプロパティ変数を変更してログを確認してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 実験対象 public String str{ get{ system.debug('【GET】' + this.str); return this.str; } set{ system.debug('【SET】' + value); this.str = value; } } |
すると、setメソッドが動いていないことが分かりました。
そのため、変数に値が入ってこなかったわけですね。
解決方法としては、変数を繰り返しの外に出して、ボタンの押下時にJavascriptで入力された値を外に出した変数に設定しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<apex:page id="Page" controller="GetSetCheckController" > <apex:form id="Form" > <!-- index --> <apex:variable value="{!1}" var="index" /> <!-- 固定文字列リストの繰り返し --> <apex:repeat value="{!StringList}" var="tmpString" > <apex:outputPanel layout="block" > <!-- 固定文字列 --> <apex:outputLabel value="{!tmpString}" /> <!-- get set用の変数 --> <apex:outputPanel layout="inline" rendered="{!index == 1}"> <input type="text" id="str" value="{!str}" /> </apex:outputPanel> </apex:outputPanel> <!-- indexの更新 --> <apex:variable value="{!index + 1}" var="index" /> </apex:repeat> <!-- 画面を更新するためのボタン --> <apex:outputPanel layout="block" > <apex:commandButton value="ボタン" rerender="Form" onclick="clickButton(event);" /> </apex:outputPanel> <apex:inputText id="str" value="{!str}" style="display: none;" /> <apex:actionFunction name="refresh" rerender="Form" /> </apex:form> <script> // ボタンクリック時処理 function clickButton(event){ var input; var prop; // 入力値を取得する input = document.querySelector('#str').value; // コントローラに送信する値に設定する prop = document.querySelector('#{!$Component.Page.Form.str}').value; // リフレッシュ処理を呼び出す refresh(); } </script> </apex:page> |
恐らくですが、もっと良い方法があると思います。
ページ内での繰り返しには気を付けなければ。
No comments.