Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
L'esdeveniment formulari OnSave en aplicacions basades en models et permet executar lògica, validar dades o cancel·lar una partida guardada abans que es guardi un registre. L'esdeveniment OnSave es produeix quan:
- L'usuari selecciona el botó de Desar o Actualitzar a la barra de comandes, 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 modificades 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
L'esdeveniment OnSave per als registres de cites, cites recurrents o d'activitat de servei cancel·la l'operació de desar i utilitza el Book missatge per desar el canvi en lloc de Create o Update. A causa d'aquest comportament, OnSave i PostSave els gestors d'esdeveniments d'aquestes taules no funcionen.
Per determinar quin botó s'ha fet clic per desar, utilitzeu el mètode getSaveMode .
Pots cancel·lar l'acció de desar utilitzant el mètode preventDefault dins de l'objecte d'arguments d'esdeveniment. El preventDefault mètode és accessible utilitzant 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.
Exemple: Quan utilitzar gestors OnSave asíncrons
Considera crear una Tasca de Servei d'Ordre de Treball on hagis de validar que l'Actiu de Client seleccionat té el mateix compte que apareix a l'Ordre de Treball. Obtenir el compte a l'Ordre de Treball i l'Actiu del Client són processos asincrònics i cal completar-los abans de poder validar.
En aquest escenari, com que hi ha múltiples processos asincrònics i ambdues trucades retornen una sola promesa, embolica ambdós al Promise.all() mètode.
Nota
Només pots utilitzar el preventDefault mètode de manera síncrona.
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"));
});
}
Activa els gestors OnSave asíncrons utilitzant una configuració d'aplicació
Per utilitzar gestors assíncrons d'onSave, activa la funció mitjançant una configuració d'aplicació:
Aneu a https://make.powerapps.com.
Assegura't de triar l'entorn adequat.
Seleccioneu Aplicacions a la subfinestra de navegació esquerra.
Selecciona l'aplicació, selecciona ... (punts puntuals), i després selecciona Edita.
Seleccioneu Configuració a la barra d'ordres.
Quan s'obri el diàleg, seleccioneu Característiques.
Activeu el controlador Async onSave.
Seleccioneu Desa.
Desactiva els temps d'expiració del gestor OnSave assíncron
Quan utilitzeu un controlador asíncron OnSave , el formulari espera que es compleixi la promesa retornada pel controlador. Per assegurar que la partida del formulari es completi a temps, el gestor activa una excepció de temps d'espera després de 10 segons per avisar-te que has d'ajustar el gestor asíncron OnSave per millorar el 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 que l'operació asíncrona espera que la promesa es resolgui, 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 crides disableAsyncTimeout, el timeout d'aquest gestor no s'aplica. Continua esperant que es compleixi la promesa d'aquest manipulador.
Aquest patró pot afectar el rendiment de la partida de formulari.
Articles relacionats
Esdeveniment Grid OnSave
Esdeveniments (referència de l'API del client)
Esdeveniments en formularis i quadrícules en aplicacions basades en models