ShowTable of Contents
一つ前の記事では、XPages における JSF のライフサイクルと、XPage やカスタムコントロールのページイベントとの関係をまとめました。
XPages における JSF ライフサイクル - ページイベント処理のタイミング
この記事では、コントロールがサポートするさまざまなプロパティがライフサイクル中でいつ評価されるのか
(JavaScript ロジックが割り振られていた場合には、そのロジックが実行される)、イベントがいつ実行されるのかをまとめます。
入力系コントロールの場合
次の簡単なXPageを使って評価タイミングを見ていきます。
パネルが2つ配置され、1つめのパネル内に、計算結果フィールドとコンボボックスが配置されています。
タイミングを確認するのは、次のプロパティとイベント(
太字)です。
- XPage
beforePageLoad/afterPageLoad/afterRestoreView/beforeRenderResponse/afterRenderResponse
- 計算結果フィールド
rendered/value
- コンボボックス
rendered/readonly/selectItems.value/onchange
注:
value はコントロールにバインドする値を指定するプロパティです。
rendered はコントロールを表示するかどうかを指定するプロパティです。
readonlyはコントロールを入力可能か表示専用で表示するかを指定するプロパティです。
また、コンボボックスの選択項目は、コンボボックス自身のプロパティではなく、その子要素である selectItems の value プロパティとして指定します。
- ケース1:新規ページアクセスの場合
RenderResponse フェーズで、コントロールの各種プロパティが評価されていることが分かります。
コンポーネントツリーの処理上、プロパティの評価は1回のリクエストに対して必ずしも1回ではない点に注意してください。
このケースでは、コンボボックスのプロパティがそれぞれ2回ずつ評価されています。
- ケース2:コンボボックスで選択を行った場合 (ページ全体を更新)
このケースでは、計算結果フィールドとコンボボックスが部分更新の対象となっているため、Render Response フェーズでの評価は、
ケース1の場合と同様です。
加えて、Apply Request Values/Process Validation/Update Model Values の各フェーズにおいても、
rendered 等のプロパティが評価されています。
onchange イベントは、Invoke Application フェーズで実行されています。
- ケース3:コンボボックスで選択を行った場合 (パネル2を部分更新する場合)
このケースでは、計算結果フィールドとコンボボックスが部分更新の対象となっていないため、
Render Response フェーズでのプロパティの評価が行われなくなっています。
それ以外は、ケース2の場合と同様です。
- ケース4:新規ページアクセスの場合 (「ページの読み込み時に計算」を設定)
プロパティなどに割り振られた JavaScript には、そのロジックをいつ実行するかを指定するオプションがあります。
デフォルトでは「動的に計算」が選択されているのですが、これを「ページの読み込み時に計算」に変更した場合の動作です。
このオプションを選択すると、プロパティの評価が Render Response フェーズから、Restore View フェーズに移動していることがわかります。
ケース5:コンボボックスで選択を行った場合 (ページ全体を更新、「ページの読み込み時に計算」を設定)
プロパティの評価は、新規ページロード時の Restore View フェーズで行ってしまっているので、このケースでは、
一切の評価が行われていません。onchange イベントの処理が行われているだけです。
このように、「ページの読み込み時に計算」オプションを指定することで、プロパティの評価回数を最低限にすることが出来ます。
但し、onchange などのイベント処理により評価値を変更することが出来ません。
そのため、値がページ読み込み時に確定してしまうことが分かっているプロパティにのみ使用してください。
繰り返しコントロールの場合