次の方法で共有


クライアント API 実行コンテキスト

実行コンテキストは、コードを実行するイベント コンテキストを定義します。 フォームまたはグリッドでイベントが発生すると、システムは実行コンテキストを渡します。 これをイベント ハンドラーで使用して、 formContextgridContext の決定、保存イベントの管理など、さまざまなタスクを実行します。

実行コンテキストは、次の方法で渡すことができます。

  • UI を使用したイベント ハンドラーの定義: 実行コンテキストは、イベント ハンドラーを介して JavaScript ライブラリ関数に渡すことができる 省略可能 なパラメーターです。 イベント実行コンテキストを渡す関数の名前を指定するときに、[ハンドラーのプロパティ] ダイアログの [実行コンテキストを最初のパラメーターとして渡す] オプションを使用します。 実行コンテキストは、この関数に渡される最初のパラメーターです。


  • コードを使用したイベント ハンドラーの定義: システムは、コードを使用して設定された関数に最初のパラメーターとして実行コンテキストを自動的に渡します。 コードでイベント ハンドラーを定義するために使用できるメソッドの一覧については、「コードを使用して イベントに関数を追加または削除する」を参照してください。

実行コンテキスト オブジェクトは、コンテキストを操作するメソッドを提供します。 詳細については、「 クライアント API の実行コンテキスト メソッドのリファレンス」を参照してください

コンテキスト オブジェクトの非同期的な使用

システムがイベントに渡すコンテキストは、イベント中に期待どおりに実行されることが保証されます。 イベント終了後にコンテキストへの参照を保持していると、コンテキストのメソッドが予期せぬ動作をもたらすアクションが発生する可能性があります。

たとえば、イベント ハンドラが実行コンテキストへの参照を保持している間に長時間を要する非同期アクションをディスパッチした場合、プロミスが解決し、コンテキスト メソッドを呼び出すまでに、エンド ユーザーが現在のページから離れてしまう可能性があります。 この状況では、元のイベント ハンドラーが実行された時点で属性に値があった場合でも、formContext.getAttribute(<name>).getValue() などのメソッドが null を戻す可能性があります。

次の例は、チェックを追加する必要がある場所を示し、イベントの完了後にイベント ハンドラー関数が実行コンテキストを使用するため、注意が必要です。

Promiseオブジェクトのコンテキストへのアクセス

コンテキストは、 プロミスが解決するの後に予期しない方法で変更される可能性があります。

function onLoad(executionContext) {
    var formContext = executionContext.getFormContext();
    fetch("https://www.contoso.com/").then(
        function (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) {
    var formContext = executionContext.getFormContext();
    var 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) {
    var formContext = executionContext.getFormContext();
    if (notReady) {
        setTimeout(function () {
            // Using formContext or executionContext here may not work as expected
            // because onLoad has already completed when this delayed function executes.
            var name = formContext.getAttribute("name").getValue();
        }, 100);
    } else {
        formContext.getAttribute("name").setValue("abc");
    }
}

クライアントAPIフォームコンテキスト
クライアントAPIグリッドコンテキスト
リボン アクションのフォームとグリッドのコンテキスト