共用方式為


模型導向應用程式中的表單 OnSave 事件 (用戶端 API 參考)

OnSave事件發生在以下情況下:

  • 使用者選取命令列中的 儲存重新整理 按鈕,即使沒有要儲存的變更資料也一樣。
  • 程式碼會執行 formContext.data.entity.save 方法,即使沒有要儲存的變更資料也一樣。
  • 使用者導覽離開表單,表單中有未儲存的資料。
  • [自動儲存] 選項會在資料變更且表單中有未儲存的資料後 30 秒啟用。
  • 程式碼會執行 formContext.data.save 方法,但表單中有未儲存的資料。
  • 程式碼執行 formContext.data.refresh 方法,將 true 值作為第一個參數傳遞,表單中有未儲存的資料。

備註

OnSave約會、週期性約會或服務活動記錄的事件會取消儲存作業,並使用Book訊息來保存變更,而不是 CreateUpdate或 。 因此, OnSavePostSave 這些資料表的事件處理常式將無法運作。

若要判斷按一下哪個按鈕來執行儲存,請使用 getSaveMode 方法。

您可以使用事件引數物件內的 preventDefault 方法來取消儲存動作。 preventDefault 方法可使用屬於執行環境定義一部分的 getEventArgs 方法來存取。 執行內容會自動傳遞至表單事件處理常式。

非同步事件處理常式支援

OnSave 事件能夠等待事件處理常式傳回的 Promise 在儲存之前結算,從而允許 OnSave 事件是非同步的 (“async”)。

OnSave當事件處理常式傳回 Promise 時OnSave,事件會變成非同步。 當處理常式傳回的每個 Promise 都已解析時,就會儲存記錄。 對於傳回的任何承諾,每個承諾都有 10 秒的限制,之後平台會認為承諾逾時。此逾時會針對每個 Promise 套用。 例如,如果我們傳回了五個 promise,則總等待時間為 50 秒。

如果 Promise 被拒絕或逾時,儲存作業會繼續以與目前 Script 錯誤類似的行為。 如果您想要防止在腳本錯誤/拒絕的 promise 或處理常式逾時時發生儲存事件,請在該特定處理常式的事件引數物件內使用 preventDefault 方法。

您也可以取消儲存作業,而不論處理常式中發生錯誤,或未在事件引數物件中使用 preventDefault 方法。 如果呼叫這個方法,非同步 OnSave 事件會等候所有 Promise 結算,但不會發生儲存。 呼叫這個方法意味著 & .catch() 中的.then()邏輯將執行。

事件 OnSave 會等候每個處理常式傳回的一個 Promise。 如果需要多個 promise,建議將所有 promise 包裝在方法中 Promise.all() ,並傳回單一結果的 promise。 對於全部傳回 Promise 的多個處理常式,建議您建立一個處理常式來呼叫所有事件,並傳回包裝所有必要 Promise 的單一 Promise。 此做法是為了將逾時所造成的等待時間降到最低。

何時使用非同步 OnSave 處理常式的範例案例

請考慮建立工單服務任務,您需要驗證選取的客戶資產是否具有工單中列出的相同帳戶。 擷取工作單和客戶資產上的帳戶都是非同步程序,必須先完成驗證。

在此案例中,由於有多個非同步進程,而且這兩個呼叫都會透過在方法中 Promise.all() 包裝兩者來傳回單一 promise。

備註

preventDefault 方法只能同步使用。

例如:

 function myHandler() {
    return Promise.all([getWorkOrderPromise, getCustomerAssetPromise]).then((values) => {
        var workOrder = values[0];
        var customerAsset = values[1];
        // Perform validation
        if (isValid(workOrder, customerAsset)) {
            return Promise.resolve();
        }
        return Promise.reject(new Error("Validation failed for the work order and customer asset"));
   });
 }

使用應用程式設定啟用非同步 OnSave

若要使用非同步 onSave 處理常式,您必須透過應用程式設定來啟用它:

  1. 移至 https://make.powerapps.com

  2. 確保選擇正確的環境。

  3. 在左側導覽窗格中,選取應用程式

  4. 選取應用程式,然後選取 ... (省略號)。 請選取 ,再編輯

  5. 從命令列中選取 設定

  6. 當對話方塊開啟時,選取 特徵

  7. 開啟 Async onSave 處理常式

  8. 選取 [儲存]。

    非同步 OnSave 應用程式設定

非同步 OnSave 逾時

當您使用非同步 OnSave 處理常式時,表單會等候處理常式傳回的 Promise 完成。 為了確保表單儲存及時完成,處理常式會在 10 秒後擲回逾時例外狀況,讓您知道要調整非同步 OnSave 處理常式以獲得更好的效能。

在某些情況下,需要暫停 OnSave 處理常式超過 10 秒。 例如,開啟對話方塊並等待使用者的輸入,然後再繼續儲存。 若要確保非同步作業會等候 Promise 解析,請使用 disableAsyncTimeout 方法。

備註

您必須在任何 await 陳述式或非同步呼叫之前呼叫 disableAsyncTimeout

例如:

async function myHandler(context) {  
     context.getEventArgs().disableAsyncTimeout();
     // The 10000ms time out will not be disabled if the above line does not come before all async awaits
     await Xrm.Navigation.openConfirmDialog({ text: "Are you sure you want to save?" });
 }

呼叫 disableAsyncTimeout 時,不會套用該處理常式的逾時。 它會繼續等待該處理程序的承諾得到實現。

應謹慎使用此模式,因為它可能會影響表單儲存的效能。

Grid OnSave 事件
事件 (用戶端 API 參考)
模型導向應用程式中表單與網格的事件