Compartir por


Evento Form OnSave (Client API reference) en aplicacións baseadas en modelos

O OnSave evento ocorre cando:

  • O usuario selecciona o botón Gardar ou Actualizar na barra de comandos, mesmo cando non hai datos modificados para gardar.
  • O código executa o método formContext.data.entity.save , mesmo cando non hai datos modificados para gardar.
  • O usuario navega fóra do formulario e hai datos non gardados no formulario.
  • A opción de gardado automático está activada, 30 segundos despois de que os datos cambien e haxa datos non gardados no formulario.
  • O código executa o método formContext.data.save e hai datos non gardados no formulario.
  • O código executa o método formContext.data.refresh pasando un valor verdadeiro como primeiro parámetro e hai datos non gardados no formulario.

Nota

O OnSave evento para os rexistros de citas, citas recorrentes ou actividades de servizo cancelará a operación de gardado e usará a Book mensaxe para manter o cambio en lugar de Create ou Update. Debido a isto, OnSave os PostSave xestores de eventos para estas táboas non funcionarán.

Para determinar en que botón se fixo clic para realizar o gardado, use o método getSaveMode .

Pode cancelar a acción de gardado empregando o método preventDefault dentro do obxecto de argumentos de evento. O método preventDefault é accesible usando o método getEventArgs que forma parte do contexto de execución. O contexto de execución pasa automaticamente ao xestor de eventos do formulario.

Soporte para o xestor de eventos asíncrono

O evento OnSave ten a capacidade de esperar a que as promesas devoltas polos xestores de eventos se resolvan antes de gardar, permitindo que o OnSave evento sexa asíncrono ("asíncrono").

O OnSave evento vólvese asíncrono cando o OnSave xestor de eventos devolve unha promesa. O gardado do rexistro ocorre cando se resolve cada promesa devolta por un xestador. Para todas as promesas que se devolven, hai un límite de 10 segundos para cada promesa, despois diso a plataforma considera que as promesas están rematadas. Este tempo de espera aplícase por promesa. Por exemplo, se temos cinco promesas devoltas, o tempo total de espera é de 50 segundos.

Se a promesa é rexeitada ou esgotada, a operación de gardado continúa comportándose de xeito similar aos erros de script actuais. Use o método preventDefault dentro do obxecto de argumentos de evento nese xestor particular se quere evitar que o evento de gardado ocorra se hai un erro de script / promesa rexeitada ou o tempo límite do manexador.

Tamén pode cancelar a operación de gardado independentemente do erro no xestor ou non empregando o método preventDefault dentro do obxecto de argumentos de evento. Se se chama a este método, o evento Async OnSave espera a que se resolvan todas as promesas, pero o gardado non ocorrerá. Chamar a este método significa que a lóxica dentro .then() de & .catch() executarase.

O OnSave evento espera a que se devolva unha promesa por manexador. Se se requiren varias promesas, recoméndase envolver todas as promesas no Promise.all() método e devolver a única promesa resultante. Para varios xestores que devolven unha promesa, recomendámosche crear un xestor que chame a todos os eventos e devolva unha única promesa que envolva todas as promesas necesarias. Esta práctica consiste en minimizar os tempos de espera causados polo tempo límite.

Exemplo de escenario sobre cando usar os xestores OnSave asíncronos

Considere crear unha tarefa de servizo de orde de traballo, debes validar que o activo do cliente seleccionado ten a mesma conta listada na orde de traballo. A obtención da conta na orde de traballo e no activo do cliente son procesos asíncronos e deben completarse antes de que se produza a validación.

Neste escenario, dado que hai varios procesos asíncronos e ambas as chamadas devolven unha única promesa envolvendo ambos no Promise.all() método.

Nota

O preventDefault método só se pode usar de forma sincrónica.

Por exemplo:

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

Activar Async OnSave usando a configuración da aplicación

Para usar os xestores asíncronos onSave, debes activalo a través dunha configuración da aplicación:

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

  2. Asegúrese de seleccionar o ambiente correcto.

  3. No panel de navegación esquerdo, seleccione Aplicacións.

  4. Seleccione a aplicación e, a continuación , seleccione ... (elipses). Seleccione Editar.

  5. Seleccione Configuración na barra de comandos.

  6. Cando se abra o diálogo, seleccione Características.

  7. Activa Asíncrono no xestor de gardar.

  8. Seleccione Gardar.

    Configuración da aplicación Async

Tempos de espera asíncronos ao gardar

Cando se usa un xestor asíncrono OnSave , o formulario espera a que se cumpra a promesa devolta polo xestador. Para asegurarse de que o gardado de formularios se completa a tempo, o xestor lanzará unha excepción de tempo límite despois de 10 segundos para informarlle de axustar o xestor asincrónico OnSave para un mellor rendemento.

Hai escenarios nos que é necesario pausar o OnSave xestor durante máis de 10 segundos. Un exemplo é abrir un diálogo e esperar a entrada do usuario antes de continuar gardando. Para asegurarse de que a operación asíncrona espera a que se resolva a promesa, use o método disableAsyncTimeout .

Nota

Debe chamar disableAsyncTimeout antes de calquera instrución de espera ou chamada asíncrona.

Por exemplo:

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?" });
 }

Cando se chama a disableAsyncTimeout , non se aplica o tempo límite para ese xestor. Segue esperando a que se cumpra a promesa dese xefe.

Este patrón debe usarse con precaución, xa que pode afectar o rendemento do gardado de formularios.

Evento Grella ao gardar
Eventos (referencia da API do cliente)
Eventos en formularios e cuadrículas en aplicacións baseadas en modelos