Comparteix via


Esdeveniment Form OnSave (referència de l'API de client) a les aplicacions basades en models

L'esdeveniment OnSave es produeix quan:

  • L'usuari selecciona el botó Desa o Actualitza a la barra d'ordres, fins i tot quan no hi ha dades canviades per desar.
  • El codi executa el mètode formContext.data.entity.save , fins i tot quan no hi ha dades canviades per desar.
  • L'usuari surt del formulari i hi ha dades no desades al formulari.
  • L'opció Desa automàticament està habilitada 30 segons després que les dades hagin canviat i hi hagi dades no desades al formulari.
  • El codi executa el mètode formContext.data.save i hi ha dades no desades al formulari.
  • El codi executa el mètode formContext.data.refresh que passa un valor real com a primer paràmetre i hi ha dades no desades al formulari.

Nota

La OnSave incidència dels registres de cita, cita periòdica o activitat de servei cancel·larà l'operació de desament i utilitzarà el Book missatge per mantenir el canvi en lloc de Create o Update. Per això, OnSave els PostSave controladors d'incidències d'aquestes taules no funcionaran.

Per determinar quin botó s'ha fet clic per desar, utilitzeu el mètode getSaveMode .

Podeu cancel·lar l'acció de desament mitjançant el mètode preventDefault dins de l'objecte event arguments. Es pot accedir al mètode preventDefault mitjançant el mètode getEventArgs que forma part del context d'execució. El context d'execució es passa automàticament al controlador d'esdeveniments del formulari.

Suport del controlador d'incidències asíncron

L'esdeveniment OnSave té la capacitat d'esperar que les promeses retornades pels controladors d'esdeveniments es liquidin abans de desar-se, permetent que l'esdeveniment OnSave sigui asíncron ("asíncron").

L'esdeveniment OnSave es torna asíncron quan el controlador d'incidències retorna OnSave una promesa. El desament del registre es produeix quan es resol cada promesa retornada per un controlador. Per a qualsevol promesa que es retorni, hi ha un límit de 10 segons per a cada promesa, després d'això la plataforma considera que les promeses s'han esgotat el temps d'espera. Aquest temps d'espera s'aplica per promesa. Per exemple, si tenim cinc promeses retornades, el temps d'espera total és de 50 segons.

Si la promesa es rebutja o s'esgota el temps d'espera, l'operació de desament continua comportant-se de manera similar als errors de script actuals. Utilitzeu el mètode preventDefault dins de l'objecte d'arguments d'esdeveniment en aquest controlador concret si voleu evitar que es produeixi l'esdeveniment de desament si hi ha un error de seqüència/promesa rebutjada o s'esgota el temps d'espera del controlador.

També podeu cancel·lar l'operació de desament independentment de l'error al controlador o no utilitzant el mètode preventDefault dins de l'objecte d'arguments d'esdeveniment. Si es crida a aquest mètode, l'esdeveniment Async OnSave espera que es liquidin totes les promeses, però el desament no es produirà. Cridar aquest mètode significa que s'executarà la lògica dins .then() de & .catch()

L'esdeveniment OnSave espera que es retorni una promesa per controlador. Si es requereixen diverses promeses, es recomana embolicar totes les promeses en el Promise.all() mètode i retornar l'única promesa resultant. Per a diversos controladors que retornen una promesa, us recomanem que creeu un controlador que cridi tots els esdeveniments i retorni una única promesa que emboliqui totes les promeses necessàries. Aquesta pràctica és minimitzar els temps d'espera causats pel temps d'espera.

Escenari d'exemple sobre quan s'han d'utilitzar controladors OnSave asíncrons

Penseu en crear una tasca de servei d'ordre de treball, heu de validar que l'actiu de client seleccionat té el mateix compte a l'ordre de treball. La recuperació del compte a l'ordre de treball i l'actiu del client són processos asíncrons i s'han de completar abans que es pugui produir la validació.

En aquest escenari, ja que hi ha diversos processos asíncrons i ambdues crides retornen una única promesa embolicant-les totes dues al Promise.all() mètode.

Nota

El preventDefault mètode només es pot utilitzar de manera sincrònica.

Per exemple:

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

Habilita l'opció Async OnSave mitjançant la configuració de l'aplicació

Per utilitzar els controladors onSave asíncrons, heu d'habilitar-los mitjançant una configuració de l'aplicació:

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

  2. Assegureu-vos de seleccionar l'entorn correcte.

  3. Seleccioneu Aplicacions a la subfinestra de navegació esquerra.

  4. Seleccioneu l'aplicació i, a continuació, seleccioneu ... (punts suspensius). Seleccioneu Editar.

  5. Seleccioneu Configuració a la barra d'ordres.

  6. Quan s'obri el diàleg, seleccioneu Característiques.

  7. Activeu el controlador Async onSave.

  8. Seleccioneu Desa.

    Configuració de l'aplicació Async OnSave

Temps d'espera d'OnSave asíncron

Quan utilitzeu un controlador asíncron OnSave , el formulari espera que es compleixi la promesa retornada pel controlador. Per assegurar-vos que el desament del formulari es completi de manera oportuna, el controlador llançarà una excepció de temps d'espera després de 10 segons per informar-vos que heu d'ajustar el controlador asíncron OnSave per obtenir un millor rendiment.

Hi ha escenaris en què cal aturar el OnSave controlador durant més de 10 segons. Un exemple és obrir un diàleg i esperar l'entrada de l'usuari abans de continuar desant. Per assegurar-vos que l'operació asíncrona espera que es resolgui la promesa, utilitzeu el mètode disableAsyncTimeout .

Nota

Heu de trucar disableAsyncTimeout abans de les instruccions d'espera o les trucades asíncrones.

Per exemple:

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

Quan es crida a disableAsyncTimeout , no s'aplica el temps d'espera d'aquest controlador. Continua esperant que es compleixi la promesa d'aquest manipulador.

Aquest patró s'ha d'utilitzar amb precaució, ja que pot afectar el rendiment del desament del formulari.

Esdeveniment Grid OnSave
Esdeveniments (referència de l'API del client)
Esdeveniments en formularis i quadrícules en aplicacions basades en models