logologo
スタート
マニュアル
開発
プラグイン
API
ホーム
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
スタート
マニュアル
開発
プラグイン
API
ホーム
logologo
RunJS 概要
モジュールのインポート
コンテナ内でのレンダリング

グローバル変数

window
document
navigator

ctx

ctx.blockModel
ctx.collection
ctx.collectionField
ctx.dataSource
ctx.dataSourceManager
ctx.element
ctx.exit()
ctx.exitAll()
ctx.filterManager
ctx.form
ctx.getModel()
ctx.getValue()
ctx.getVar()
ctx.i18n
ctx.importAsync()
ctx.initResource()
ctx.libs
ctx.location
ctx.logger
ctx.makeResource()
ctx.message
ctx.modal
ctx.model
ctx.notification
ctx.off()
ctx.on()
ctx.openView()
ctx.render()
ctx.request()
ctx.requireAsync()
ctx.resource
ctx.route
ctx.router
ctx.setValue()
ctx.sql
ctx.t()
ctx.view
Previous Pagectx.off()
Next Pagectx.openView()
AI翻訳通知

このドキュメントはAIによって翻訳されました。正確な情報については英語版をご参照ください。

#ctx.on()

RunJS において、コンテキストイベント(フィールド値の変更、プロパティの変更、リソースの更新など)を購読します。イベントはそのタイプに応じて、ctx.element 上のカスタム DOM イベント、または ctx.resource の内部イベントバスにマッピングされます。

#適用シーン

シーン説明
JSField / JSEditableField外部(フォーム、連動など)からのフィールド値の変更を監視して UI を同期的に更新し、双方向バインディングを実現します。
JSBlock / JSItem / JSColumnコンテナ上のカスタムイベントを監視し、データや状態の変化に応答します。
resource 関連リソースの更新や保存などのライフサイクルイベントを監視し、データ更新後にロジックを実行します。

#型定義

on(eventName: string, handler: (event?: any) => void): void;

#よく使われるイベント

イベント名説明イベントソース
js-field:value-changeフィールド値が外部から変更された(フォーム連動、デフォルト値の更新など)ctx.element 上の CustomEvent。ev.detail が新しい値となります。
resource:refreshリソースデータが更新されたctx.resource イベントバス
resource:savedリソースの保存が完了したctx.resource イベントバス

イベントのマッピングルール:resource: プレフィックスが付いているものは ctx.resource.on を経由し、それ以外は通常 ctx.element 上の DOM イベント(存在する場合)を経由します。

#例

#フィールドの双方向バインディング(React useEffect + クリーンアップ)

React.useEffect(() => {
  const handler = (ev) => setValue(ev?.detail ?? '');
  ctx.on?.('js-field:value-change', handler);
  return () => {
    ctx.off?.('js-field:value-change', handler);
  };
}, []);

#ネイティブ DOM の監視(ctx.on が利用できない場合の代替案)

// ctx.on が提供されていない場合は、ctx.element を直接使用できます
const handler = (ev) => {
  if (selectEl) selectEl.value = String(ev?.detail ?? '');
};
ctx.element?.addEventListener('js-field:value-change', handler);
// クリーンアップ時:ctx.element?.removeEventListener('js-field:value-change', handler);

#リソース更新後の UI 更新

ctx.resource?.on('refresh', () => {
  const data = ctx.resource?.getData?.();
  // データの更新に基づいてレンダリングを更新
});

#ctx.off との組み合わせ

  • ctx.on で登録したリスナーは、メモリリークや重複実行を避けるため、適切なタイミングで ctx.off を使用して削除する必要があります。
  • React では、通常 useEffect のクリーンアップ関数内で ctx.off を呼び出します。
  • ctx.off が存在しない場合があるため、使用時はオプショナルチェイニング(ctx.off?.('eventName', handler))の使用を推奨します。

#注意事項

  1. ペアでの解除: ctx.on(eventName, handler) を呼び出すたびに、対応する ctx.off(eventName, handler) が必要です。また、渡される handler の参照は同一である必要があります。
  2. ライフサイクル: コンポーネントのアンマウントやコンテキストの破棄の前にリスナーを削除してください。そうしないとメモリリークの原因になります。
  3. イベントの可用性: コンテキストのタイプによってサポートされるイベントが異なります。詳細は各コンポーネントのドキュメントを参照してください。

#関連ドキュメント

  • ctx.off - イベントリスナーの削除
  • ctx.element - レンダリングコンテナと DOM イベント
  • ctx.resource - リソースインスタンスとその on/off
  • ctx.setValue - フィールド値の設定(js-field:value-change をトリガーします)