模型驱动应用中的 Form OnSave 事件(客户端 API 参考)

OnSave 以下情况下发生该事件:

  • 用户选择命令栏中的 “保存 ”或“ 刷新 ”按钮,即使没有要保存更改的数据。
  • 代码执行 formContext.data.entity.save 方法,即使没有要保存更改的数据。
  • 用户离开窗体,窗体中存在未保存的数据。
  • “自动保存”选项在数据更改后 30 秒处于启用状态,表单中存在未保存的数据。
  • 代码执行 formContext.data.save 方法,并且窗体中有未保存的数据。
  • 代码执行 formContext.data.refresh 方法,该方法将 true 值作为第一个参数传递,并且表单中存在未保存的数据。

注释

OnSave约会、定期约会或服务活动记录的事件将取消保存作,并使用Book消息来保留更改,而不是CreateUpdate。 因此, OnSave 这些 PostSave 表的事件处理程序将不起作用。

若要确定单击哪个按钮执行保存,请使用 getSaveMode 方法。

可以在事件参数对象中使用 preventDefault 方法取消保存作。 可以使用执行上下文中的 getEventArgs 方法访问 preventDefault 方法。 执行上下文会自动传递给表单事件处理程序。

异步事件处理程序支持

OnSave 事件能够等待事件处理程序返回的承诺在保存之前解决,从而允许 OnSave 事件异步(“async”)。

当事件处理程序返回承诺时,OnSaveOnSave事件将成为异步事件。 解决处理程序返回的每个承诺时,将保存记录。 对于返回的任何承诺,每个承诺都有 10 秒的限制,之后平台会将承诺超时。此超时按承诺应用。 例如,如果返回了 5 个承诺,则总等待时间为 50 秒。

如果承诺被拒绝或超时,则保存作将继续与当前脚本错误类似。 如果要防止发生脚本错误/拒绝的承诺或处理程序超时,请使用该特定处理程序中事件参数对象中的 preventDefault 方法。

还可以取消保存作,而不考虑处理程序中的错误或在事件参数对象中使用 preventDefault 方法。 如果调用此方法,Async OnSave 事件将等待所有承诺解决,但不会发生保存。 调用此方法意味着内部的.catch()逻辑.then()将执行。

OnSave 事件等待每个处理程序返回的一个承诺。 如果需要多个承诺,建议在方法中 Promise.all() 包装所有承诺并返回单个生成的承诺。 对于所有返回承诺的多个处理程序,建议创建一个处理程序来调用所有事件,并返回包装所有所需承诺的单个承诺。 这种做法是尽量减少超时导致的等待时间。

有关何时使用异步 OnSave 处理程序的示例方案

请考虑创建工作订单服务任务,需要验证所选的客户资产是否与工作订单中列出的帐户相同。 提取工作订单和客户资产上的帐户既是异步过程,需要先完成,然后才能进行验证。

在此方案中,由于有多个异步进程,并且两个调用都通过在方法中 Promise.all() 包装来返回单个承诺。

注释

该方法 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"));
   });
 }

使用应用设置启用 Async OnSave

若要使用异步 onSave 处理程序,需要通过应用设置启用它:

  1. 转到 https://make.powerapps.com

  2. 请确保选择正确的环境。

  3. 从左侧导航窗格中选择 “应用 ”。

  4. 选择应用,然后选择 ... (省略号)。 选择 编辑

  5. 从命令栏中选择 “设置 ”。

  6. 当对话框打开时,选择 “功能”。

  7. 打开 Async onSave 处理程序

  8. 选择“保存”

    Async OnSave 应用设置

异步 OnSave 超时

使用异步 OnSave 处理程序时,窗体将等待处理程序返回的承诺完成。 为了确保表单及时保存完成,处理程序会在 10 秒后引发超时异常,以便告知你优化异步 OnSave 处理程序以提高性能。

在某些情况下,需要暂停 OnSave 处理程序超过 10 秒。 例如,打开对话框并等待用户的输入,然后继续保存。 若要确保异步作等待承诺解析,请使用 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 参考)
模型驱动应用内窗体和网格中的事件