Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Formularhændelsen OnSave i modeldrevne apps giver dig mulighed for at køre logik, validere data eller annullere en lagring, før en post gemmes. Hændelsen OnSave opstår, når:
- Brugeren vælger knappen Gem eller Opdater på kommandolinjen, også selvom der ikke er nogen ændrede data at gemme.
- Kode udfører metoden formContext.data.entity.save , også selvom der ikke er nogen ændrede data at gemme.
- Brugeren navigerer væk fra formularen, og der er ikke-gemte data i formularen.
- Indstillingen Autosave er aktiveret, 30 sekunder efter at dataene er ændret, og der er ikke-gemte data i formularen.
- Code udfører metoden formContext.data.save , og der er ikke-gemte data i formularen.
- Code udfører metoden formContext.data.refresh og overfører en sand værdi som den første parameter, og der er ikke-gemte data i formularen.
Notat
Hændelsen OnSave for aftaler, tilbagevendende aftaler eller serviceaktivitetsposter annullerer lagringshandlingen og bruger Book meddelelsen til at gemme ændringen i stedet for Create eller Update. På grund af denne funktionsmåde OnSave fungerer PostSave hændelseshandlere for disse tabeller ikke.
Hvis du vil finde ud af, hvilken knap der blev klikket på for at udføre lagringen, skal du bruge metoden getSaveMode .
Du kan annullere lagringshandlingen ved hjælp af metoden preventDefault i objektet event arguments. Metoden preventDefault er tilgængelig ved hjælp af metoden getEventArgs , der er en del af udførelseskonteksten. Udførelseskonteksten overføres automatisk til formularhændelseshandleren.
Understøttelse af asynkron hændelseshandler
OnSave-hændelsen har mulighed for at vente på, at de løfter, der returneres af hændelseshandlere, afregnes, før de gemmes, hvilket gør det OnSave muligt for hændelsen at være asynkron ("asynkron").
Hændelsen OnSave bliver asynkron OnSave , når hændelseshandleren returnerer et løfte. Lagring af posten sker, når hvert løfte, der returneres af en handler, er løst. For alle løfter, der returneres, er der en grænse på 10 sekunder for hvert løfte, efter at platformen anser løfter for at blive afbrudt pga. timeout. Denne timeout anvendes pr. løfte. Hvis vi f.eks. har fem løfter returneret, er den samlede ventetid 50 sekunder.
Hvis løftet afvises eller får timeout, fungerer lagringshandlingen fortsat på samme måde som de aktuelle scriptfejl. Brug metoden preventDefault i objektet med hændelsesargumenter i den pågældende handler, hvis du vil forhindre, at lagringshændelsen opstår, hvis der opstår en scriptfejl/et afvist løfte, eller handleren får timeout.
Du kan også annullere lagringshandlingen, uanset fejlen i handleren, eller du kan ikke bruge metoden preventDefault i objektet med hændelsesargumenter. Hvis denne metode kaldes, venter den asynkrone OnSave-hændelse på, at alle løfterne bliver løst, men lagringen sker ikke. Kald af denne metode betyder, at logikken i .then() & .catch() udføres.
Hændelsen OnSave venter på ét løfte, der returneres pr. handler. Hvis der kræves flere løfter, anbefales det at ombryde alle løfterne i Promise.all() metoden og returnere det enkelt resulterende løfte. For flere handlere, der alle returnerer et løfte, anbefaler vi, at du opretter én handler, der kalder alle hændelserne og returnerer et enkelt løfte, der ombryder alle påkrævede løfter. Denne fremgangsmåde er at minimere ventetider, der skyldes timeout.
Eksempel: Hvornår skal du bruge asynkrone OnSave-handlere
Overvej at oprette en arbejdsordreserviceopgave, hvor du skal validere, at det valgte kundeanlæg har den samme konto, der er angivet i arbejdsordren. Hentning af kontoen på arbejdsordren og kundeaktivet er begge asynkrone processer, og du skal fuldføre begge dele, før du kan validere.
Da der i dette scenarie er flere asynkrone processer, og begge kald returnerer et enkelt løfte, skal du ombryde begge i Promise.all() metoden.
Notat
Du kan kun bruge preventDefault metoden synkront.
Eksempel:
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"));
});
}
Aktivér asynkrone OnSave-handlere ved hjælp af en appindstilling
Hvis du vil bruge asynkrone onSave-handlere, skal du aktivere funktionen via en appindstilling:
Gå til https://make.powerapps.com.
Sørg for at vælge det korrekte miljø.
Vælg Apps i venstre navigationsrude.
Vælg appen, vælg ... (ellipse), og vælg derefter Rediger.
Vælg Indstillinger på kommandolinjen.
Når dialogboksen åbnes, skal du vælge Funktioner.
Slå Async onSave-handler til.
Vælg Gem.
Deaktiver timeout for asynkron OnSave-handler
Når du bruger en asynkron OnSave handler, venter formularen på, at det løfte, der returneres af handleren, opfyldes. Hvis du vil sikre, at formularlagringen fuldføres rettidigt, udløser handleren en timeoutundtagelse efter 10 sekunder, så du får besked om at justere asynkron OnSave handleren for at opnå en bedre ydeevne.
Der er scenarier, hvor det er nødvendigt at afbryde handleren OnSave midlertidigt i mere end 10 sekunder. Et eksempel er at åbne en dialogboks og vente på brugerens input, før du fortsætter med at gemme. Hvis du vil sikre, at den asynkrone handling venter på, at løftet løses, skal du bruge metoden disableAsyncTimeout .
Notat
Du skal ringe op disableAsyncTimeout , før nogen afventer-sætninger eller asynkrone kald.
Eksempel:
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?" });
}
Når du kalder disableAsyncTimeout, anvendes timeout for den pågældende handler ikke. Det fortsætter med at vente på, at handlerens løfte om at blive opfyldt.
Dette mønster kan påvirke ydeevnen af formularlagringen.
Relaterede artikler
OnSave-hændelse for gitter
Hændelser (klient-API-reference)
Hændelser i formularer og gitre i modelbaserede apps