2023年4月25日火曜日

動的アクションのイベント有効範囲を確認する

 Oracle APEXの動的アクションイベント有効範囲という設定があります。このイベント有効範囲として、静的動的1回のどれかを選ぶことができます。

簡単なアプリケーションを作成し、このプロパティイベント有効範囲の使い方を確認します。


確認アプリケーションの作成


以下のページを作成し、それぞれイベント有効範囲が異なる動的アクションを作成します。

ボタン、ページ・アイテム、動的コンテンツのリージョンを作成します。


ボタンREFRESHをクリックすると、リージョンTESTをリフレッシュします。ボタン動作アクションとして動的アクションで定義を指定します。


動的アクションのタイミングイベントクリック選択タイプボタンボタンREFRESHになります。


実行するTRUEアクションとしてリフレッシュを選択します。影響を受ける要素選択タイプリージョンリージョンTESTを指定します。


ページ・アイテムP1_STATUSを作成します。タイプテキスト・フィールドです。このページ・アイテムは、動的アクションのイベント有効範囲の違いを確認するために使用します。

ページ番号1イベント有効範囲静的のケース、ページ番号2動的のケース、ページ番号31回のケースを実装します。そのため、作成するページ・アイテムは、ページ番号に従ってP1_STATUSP2_STATUSP3_STATUSとなります。


タイプ動的コンテンツリージョンを作成します。

ソースCLOBを返すPL/SQLファンクション本体として、以下を記述します。


クラスdummyclassが設定されたDIV要素に対して動的アクションを作成します。この要素にマウスが乗った時テキスト・コンテンツをページ・アイテムPn_STATUSにコピーします。

詳細静的IDとしてtestを設定します。



イベント有効範囲が静的のケース



動的コンテンツに含まれるDIV要素動的アクションを作成するため、動的アクション・ビューより動的アクションを作成します。

実行イベント有効範囲として静的を選択します。

タイミングイベントマウス・エンター選択タイプjQueryセレクタjQueryセレクタとして#test .dummyclassを指定します。

リージョンTESTに含まれるDIV要素(classにdummyclassを含む)にマウスが乗ると、TRUEアクションが実行されます。


実行するTRUEアクションとしてJavaScriptコードの実行を選択し、設定コードとして以下を記述します。

console.log(this.triggeringElement.textContent);
apex.items.P1_STATUS.setValue(this.triggeringElement.textContent);

初期化時に実行オフにします。


マウスが離れたときに、ページ・アイテムをクリアする動的アクションも作成します。

タイミングイベントマウス・リーブを選択します。選択タイプjQueryセレクタは、マウス・エンターと同じ設定にします。


TRUEアクションとしてクリアを選択します。影響を受ける要素選択タイプアイテムアイテムとしてP1_STATUSを選択します。

実行初期化時に実行オフにします。


リージョンTESTの属性にあるパフォーマンスの遅延ロードは、オフであることが必須です。


イベント有効範囲静的の場合、動的アクションが設定されたHTML要素が更新されるとイベントが処理されなくなります。ページ全体の再ロードを伴わない更新は、一般にリージョンリフレッシュとして実装されています。遅延ロードオンの場合は、ページのロード後にリージョンのリフレッシュを実行するといった動作になるため、イベントが処理されなくなります。

イベント有効範囲が静的の場合は、以下のような動作になります。

ページ・ロード直後はDIV要素にマウスを乗せると動的アクションが呼び出され、ページ・アイテムP1_STATUSに文字列がコピーされます。その後、ボタンRefreshをクリックし、リージョンTESTをリフレッシュすると、動的アクションは(ページを再ロードするまで)呼び出されなくなります。



イベント有効範囲が動的のケース



実行イベント有効範囲動的にします。静的コンテナ(jQueryセレクタ)として#testを設定します。#testで指定されるリージョンTESTの内容は、リフレッシュを実行することにより書き換えられます。しかし、リージョンTESTの枠は変わらないため、静的コンテナとして指定できます。

タイミングイベントマウス・エンター選択タイプとしてjQueryセレクタjQueryセレクタとして.dummyclassを指定します。


動的アクションMouse Leaveイベントマウス・リーブを選択する以外は、マウス・エンターと同じ設定にします。


イベント有効範囲動的としている場合は、リージョンTESTの遅延ロードオンにできます。


イベント有効範囲を動的にした場合の動作です。

リージョンのリフレッシュを行った後も動的アクションが呼び出されています。



イベント有効範囲が1回のケース



イベント有効範囲1回は静的と近いですが、動的アクションが1回呼び出されると、それ以降は(ページが再ロードされるまで)呼び出されません。

実行イベント有効範囲1回タイミング選択タイプjQueryセレクタjQueryセレクタとして#test .dummyclassを設定します。リージョンTESTの遅延ロードオフにします。


イベント有効範囲を1回にした場合の動作です。

ページ・ロード直後に1回だけ動的アクションが呼び出されますが、それ以降は呼び出されなくなります。また、呼び出されない状況はリージョンのリフレッシュを行っても変わりません。


動的アクションのイベント有効範囲の説明は以上になります。

今回の確認作業で使用したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/dynamic-actions-event-scope-test.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。