実行コンテキストは、コードを実行するイベント コンテキストを定義します。 フォームまたはグリッドでイベントが発生すると、システムは実行コンテキストを渡します。 これをイベント ハンドラーで使用して、 formContext や gridContext の決定、保存イベントの管理など、さまざまなタスクを実行します。
実行コンテキストは、次の方法で渡すことができます。
UI を使用したイベント ハンドラーの定義: 実行コンテキストは、イベント ハンドラーを介して JavaScript ライブラリ関数に渡すことができる 省略可能 なパラメーターです。 イベント実行コンテキストを渡す関数の名前を指定するときに、[ハンドラーのプロパティ] ダイアログの [実行コンテキストを最初のパラメーターとして渡す] オプションを使用します。 実行コンテキストは、この関数に渡される最初のパラメーターです。
- コードを使用したイベント ハンドラーの定義: システムは、コードを使用して設定された関数に最初のパラメーターとして実行コンテキストを自動的に渡します。 コードでイベント ハンドラーを定義するために使用できるメソッドの一覧については、「 クライアント API コードを使用してイベント ハンドラー関数を追加または削除する」を参照してください。
実行コンテキスト オブジェクトは、コンテキストを操作するメソッドを提供します。 詳細については、「 クライアント API の実行コンテキスト メソッドのリファレンス」を参照してください。
コンテキスト オブジェクトを非同期的に使用する
システムがイベントに渡すコンテキストは、イベント処理中にのみ期待どおりに動作します。 イベントの終了後もコンテキストへの参照を保持すると、コンテキスト メソッドが予期しない動作をする原因となるアクションが発生する可能性があります。
たとえば、実行コンテキストへの参照を保持している間に長い時間がかかる非同期アクションをイベント ハンドラーがディスパッチした場合、promise が解決され、コンテキスト メソッドを呼び出す時点までに、エンド ユーザーは現在のページを離れている可能性があります。 この状況では、元のイベント ハンドラーが実行された時点で属性に値があった場合でも、formContext.getAttribute(<name>).getValue() などのメソッドが null を戻す可能性があります。
次の例は、イベントハンドラー関数がイベントの終了後に実行コンテキストを使用するため、チェックを追加し、注意する必要がある場所を示しています。
Promise でコンテキストにアクセスする
コンテキストは、 プロミスが解決するの後に予期しない方法で変更される可能性があります。
function onLoad(executionContext) {
const formContext = executionContext.getFormContext();
fetch("https://www.contoso.com/").then((result) => {
// Using formContext or executionContext here may not work as expected
// because onLoad has already completed when the promise is resolved.
formContext.getAttribute("name").setValue(result);
});
}
await ステートメントの後でコンテキストにアクセスする
コンテキストは、await 内で async 関数を使用した後予期しない方法で変更される可能性があります。
async function onLoad(executionContext) {
const formContext = executionContext.getFormContext();
const result = await fetch("https://www.contoso.com/");
// Using formContext or executionContext here might not work as expected
// because the synchronous part of onLoad has already completed.
formContext.getAttribute("name").setValue(result);
}
タイムアウト関数内でコンテキストにアクセスする
setTimeout または setInterval を使用して一部のコードの実行を延期した後、コンテキストが予期しない方法で変更される場合があります。
function onLoad(executionContext) {
const formContext = executionContext.getFormContext();
if (notReady) {
setTimeout(() => {
// Using formContext or executionContext here may not work as expected
// because onLoad has already completed when this delayed function executes.
const name = formContext.getAttribute("name").getValue();
}, 100);
} else {
formContext.getAttribute("name").setValue("abc");
}
}
関連記事
クライアントAPIフォームコンテキスト
クライアントAPIグリッドコンテキスト
リボン アクションのフォームとグリッドのコンテキスト