【OutSystems Tips】スクリーンライフサイクル完全解説|6つのイベントの実行順序と使いどころ

OutSystems備忘録

OutSystems Reactive Webアプリ開発で、初心者〜中級者が最もつまずくテーマのひとつがスクリーンライフサイクルです。「データを取得したはずなのに画面に反映されない」「OnInitializeに書いたのにエラーになる」「BlockのOnReadyが先に動いてしまう」——こうした謎の挙動は、ライフサイクルイベントの実行順序を知ることで一気に解決します。

この記事では、6つのライフサイクルイベントを実行順序・役割・よくあるミスの3点セットで徹底解説します。

1. ライフサイクルとは何か?

スクリーンのライフサイクルとは、「ユーザーが画面を開いてから閉じるまでの間に、OutSystemsが自動的に実行する一連のイベント」のことです。

Traditional Web AppにはPreparationアクションがあり、サーバーサイドで同期的にデータを準備してからHTMLを返していました。しかしReactive Web Appでは、画面の描画とデータ取得が非同期で並行して動くため、「どのタイミングで何が実行されるか」を正確に把握しないと意図しない挙動が起きます。

2. 6つのライフサイクルイベント一覧

イベント名 発火回数 主な用途
OnInitialize 1回のみ ローカル変数の初期化・デフォルト値のセット
OnReady 1回のみ DOM操作・JavaScript呼び出し・初期アクション実行
OnRender 複数回 画面の再描画時に毎回実行(基本的に使わない)
OnAfterFetch Fetch完了毎 Aggregate/Data Actionのデータ取得完了後の後処理
OnParametersChanged パラメータ変化毎 Blockの入力パラメータが変わった時の再処理
OnDestroy 1回のみ 画面破棄時のクリーンアップ(タイマー解除など)

3. 実行順序を図で理解する

画面を開いたときのイベント実行順序は以下のとおりです。親Screenと子Blockが存在する場合、OnInitializeは親→子の順で実行されますが、OnReadyは逆に子→親の順で実行される点が最大のポイントです。

順番 イベント 説明
親Screen:OnInitialize 変数の初期化。サーバーアクセスは禁止
子Block:OnInitialize 子のBlock内の変数初期化
Aggregate / Data Action(非同期) Fetch = At Start のデータ取得が並行して開始
子Block:OnReady 子のDOM構築完了。操作可能になる
親Screen:OnReady 全コンポーネントのDOM構築完了
OnAfterFetch(Aggregate完了後) データ取得完了後に発火。データ確定後の処理はここ
OnRender(変数変化のたびに) 画面の再描画が必要になるたびに発火

🚫 重要:OnInitializeでサーバーにアクセスしてはいけない

OnInitializeが完了するまで画面の描画が始まりません。ここでServer ActionやAggregate(Fetch = On Demand以外)を呼ぶと、ユーザーは白い画面を見続けることになります。サーバーアクセスは必ずAggregateまたはData Actionに任せてください。

4. 各イベントの詳細解説と使いどころ

① OnInitialize

画面・Blockが初期化されるタイミングで1回だけ実行されます。ローカル変数のデフォルト値セットや、入力パラメータを使った初期値の計算に使います。

📝 使っていいこと / 使ってはいけないこと

✅ ローカル変数への値のセット
✅ 入力パラメータを使った計算
🚫 Server Actionの呼び出し
🚫 Aggregate(Fetch = At Start)への依存
🚫 DOM操作

② OnReady

すべてのコンポーネントのDOMが構築された後に1回実行されます。JavaScriptでDOM要素を操作したい場合はOnReadyが安全な唯一の場所です。子Blockより親Screenのほうが後に実行される点に注意が必要です。

③ OnRender

画面の変数や状態が変わるたびに何度も実行されます。原則として何も書かないのが正解です。特にOnRender内でAggregate Refreshを呼ぶと、データ取得→変数変化→再描画→OnRender→再取得という無限ループが発生します。

🚫 OnRenderでやってはいけないこと

OnRender内でRefresh Dataを呼ぶと無限ループになります。「画面が固まる」「ローディングが終わらない」という症状の多くがこれです。

④ OnAfterFetch

AggregateまたはData Actionのデータ取得が完了した後に実行されます。「データが取れてから次の処理をしたい」という場面に最適です。取得データを別の変数に加工して入れたり、取得件数に応じて条件分岐したりする処理をここに書きます。

⑤ OnParametersChanged

Blockの入力パラメータが外側から変更されたときだけ実行されます。パラメータの変化に応じてAggregate Refreshや変数の再計算を行う場合に使います。親Screenの変数は変化しません。子Block内の処理のみが対象です。

⑥ OnDestroy

画面がメモリから破棄されるタイミングで実行されます。JavaScriptで設定したタイマー(setInterval)の解除や、外部ライブラリのインスタンス解放など、後片付け処理に使います。

5. よくある間違いと正しい対処法

症状 原因 正しい対処
画面が真っ白で固まる OnInitializeでServer Action呼び出し Server ActionをData Actionに移す
ローディングが終わらない OnRenderでRefresh Dataを呼んでいる(無限ループ) OnRenderからRefresh Dataを削除
取得データが空のまま処理される OnReadyでAggregateのデータを使おうとしている(まだ取得中) AggregateのOnAfterFetchに処理を移す
BlockのOnReadyで親のデータが使えない 子BlockのOnReadyは親のOnReadyより先に実行される BlockにEventを設置して親から呼ぶ構成にする
パラメータを変えても再取得されない OnParametersChangedでRefresh Dataを呼んでいない OnParametersChangedにRefresh Dataを追加

まとめ

✅ この記事のポイント

  • OnInitialize:変数初期化のみ。サーバーアクセス禁止
  • OnReady:DOM操作はここ。子→親の順で実行される
  • OnRender:原則何も書かない。Refresh Dataは無限ループの元
  • OnAfterFetch:データ取得後の処理はここ
  • OnParametersChanged:Blockのパラメータ変化に反応
  • OnDestroy:後片付け処理のみ

コメント

タイトルとURLをコピーしました