Evento OnSave de formulario (referencia de API de cliente) en aplicaciones basadas en modelos

El evento OnSave se produce cuando:

  • El usuario selecciona el icono Guardar en la esquina inferior derecha del formulario, incluso cuando no hay datos modificados para guardar.
  • El código ejecuta el método formContext.data.entity.save, incluso si no hay datos modificados para guardar.
  • El usuario navega fuera del formulario y hay datos sin guardar en el formulario.
  • La opción de autoguardado está habilitada, 30 segundos después de que los datos han cambiado y hay datos sin guardar en el formulario.
  • El código ejecuta el método formContext.data.save y hay datos sin guardar en el formulario.
  • El código ejecuta el método formContext.data.refresh que pasa un valor true al primer parámetro y hay datos sin guardar en el formulario.

Para determinar en qué botón se ha hecho clic para realizar la acción de guardar, use el método getSaveMode.

Puede cancelar la acción de guardar mediante el método preventDefault en el objeto de argumentos del evento. Se puede acceder al método preventDefault mediante el método getEventArgs que forma parte del contexto de ejecución. El contexto de ejecución se transfiere automáticamente al controlador de eventos del formulario.

Compatibilidad con el controlador de eventos asincrónico

El evento OnSave tiene la capacidad de esperar a que se resuelvan las promesas devueltas por los controladores de eventos antes de guardar, lo que permite al evento OnSave ser asincrónico ("async").

El evento OnSave se vuelve asíncrono cuando un controlador de eventos OnSave devuelve una promesa. El guardado del registro ocurre cuando se resuelve cada promesa devuelta por un controlador. Para las promesas que se devuelven, hay un límite de 10 segundos para cada promesa, después de eso, la plataforma considera que las promesas están vencidas. Este tiempo de espera se aplica según la promesa. Por ejemplo, si tenemos cinco promesas, el tiempo total de espera es de 50 segundos.

Si la promesa se rechaza o se agota el tiempo de espera, la operación de guardado continúa comportándose de manera similar a los errores de secuencia de comandos actuales. Use el método preventDefault dentro del objeto de argumentos de evento en ese controlador en particular si desea evitar que suceda el evento de guardado si hay un error de secuencia de comandos / promesa rechazada o tiempo de espera del controlador.

También puede cancelar la operación de guardado independientemente del error en el controlador o de no usar el método preventDefault dentro del objeto de argumentos de evento. Si se llama a este método, el evento Async OnSave seguirá esperando a que se resuelvan todas las promesas, pero no se guardará. Esto significa que la lgica dentro de .then() & .catch() todavía se ejecutará.

El evento OnSave solo esperará a que se devuelva una promesa por controlador. Si se requieren varias promesas, se recomienda encapsular todas las promesas en el método Promise.all() y devolver la única promesa resultante. Para varios controladores que devuelven una promesa, le recomendamos que cree un controlador que llame a todos los eventos y devuelva una única promesa que encapsule todas las promesas requeridas. Esto es para minimizar los tiempos de espera causados por el tiempo de espera.

Escenario de ejemplo sobre cuándo usar controladores OnSave asíncronos

Considere la posibilidad de crear una tarea de servicio de orden de trabajo, debe validar que el activo del cliente seleccionado tenga la misma cuenta que aparece en la orden de trabajo. La obtención de la cuenta en la orden de trabajo y el activo del cliente son procesos asincrónicos y deben completarse antes de que se pueda realizar la validación.

En este escenario, dado que hay varios procesos asíncronos y ambas llamadas devuelven una única promesa al encapsular ambas en el método Promise.all().

Nota

preventDefault solo se puede utilizar de forma sincrónica. Por ejemplo, en el siguiente controlador:

function myHandler(context) {
return new Promise((resolve) => {
setTimeout( () => {
context.getEventArgs().preventDefault();
}, 1000);
 });
}

Habilitar Async OnSave usando la configuración de la aplicación

Para usar controladores onSave asíncronos, deberá habilitarlos a través de una configuración de aplicación.

  1. Vaya a https://make.powerapps.com.

  2. Asegúrese de seleccionar el entorno correcto.

  3. Seleccione Aplicaciones en el panel de navegación izquierdo.

  4. Seleccione la aplicación y, a continuación, seleccione ... (puntos suspensivos). Seleccione Editar.

  5. Seleccione Configuración en la barra de comandos.

  6. Cuando se abra el cuadro de diálogo, seleccione Características.

  7. Active Controlador onSave asincrónico.

  8. Seleccione Guardar.

    Configuración de la aplicación Async OnSave

Tiempo de espera de Async onSave

Cuando se usa un guardado asíncrono, el controlador esperará a que se cumpla la promesa. Para asegurarse de que un guardado se complete a tiempo, el controlador lanza una excepción de tiempo de espera después de 10 segundos para informarle que debe ajustar el evento Async OnSave para un mejor rendimiento.

Puede haber escenarios en los que desee detener la ejecución de OnSave y el tiempo de espera detendrá la operación. Un ejemplo es abrir un diálogo en el Async OnLoad y esperar la entrada del usuario antes de guardar. Para asegurarse de que la operación asíncrona esperará, puede proporcionar el argumento del evento disableAsyncTimeout(executioncontext.getEventArgs().disableAsyncTimeout()).

Cuando se establece ** disableAsyncTimeout, no se aplicará el tiempo de espera para ese controlador. Continuará esperando que se cumpla la promesa de ese manejador.

Esto debe usarse con precaución ya que podría afectar el rendimiento del guardado del formulario.

Artículo relacionado

Evento OnSave de cuadrícula

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).