Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med formulärhändelsen OnSave i modelldrivna appar kan du köra logik, verifiera data eller avbryta en sparad fil innan en post sparas. Händelsen OnSave inträffar när:
- Användaren väljer knappen Spara eller Uppdatera i kommandofältet, även om det inte finns några ändrade data att spara.
- Code kör metoden formContext.data.entity.save , även om det inte finns några ändrade data att spara.
- Användaren navigerar bort från formuläret och det finns data som inte har sparats i formuläret.
- Alternativet Spara automatiskt är aktiverat, 30 sekunder efter att data har ändrats och det finns data som inte har sparats i formuläret.
- Koden kör metoden formContext.data.save och det finns data som inte har sparats i formuläret.
- Koden kör metoden formContext.data.refresh och skickar ett sant värde som den första parametern och det finns data som inte har sparats i formuläret.
Anmärkning
Händelsen OnSave för avtalade tider, återkommande avtalade tider eller tjänstaktivitetsposter avbryter spara-åtgärden och använder Book meddelandet för att spara ändringen i stället för Create eller Update. På grund av det här beteendet OnSave fungerar PostSave inte händelsehanterare för dessa tabeller.
Använd metoden getSaveMode för att avgöra vilken knapp som klickades för att spara.
Du kan avbryta spara-åtgärden med hjälp av metoden preventDefault i händelseargumentobjektet. Metoden preventDefault är tillgänglig med hjälp av metoden getEventArgs som är en del av körningskontexten. Körningskontext skickas automatiskt till formulärhändelsehanteraren.
Stöd för asynkron händelsehanterare
OnSave-händelsen har möjlighet att vänta på att löften som returneras av händelsehanterare ska lösas innan de OnSave sparar, vilket gör att händelsen kan vara asynkron ("asynkron").
Händelsen OnSave blir asynkron OnSave när händelsehanteraren returnerar ett löfte. Sparandet av posten sker när varje löfte som returneras av en hanterare har lösts. För alla löften som returneras finns det en gräns på 10 sekunder för varje löfte, efter det anser plattformen att löften är tidsgränsen. Den här tidsgränsen tillämpas per löfte. Om vi till exempel har fem löften returnerade är den totala väntetiden 50 sekunder.
Om löftet avvisas eller tidsgränsen överskrids fortsätter spara-åtgärden att fungera på samma sätt som de aktuella skriptfelen. Använd metoden preventDefault i händelseargumentobjektet i den specifika hanteraren om du vill förhindra att spara-händelsen inträffar om det finns ett skriptfel/ett nekat löfte eller en tidsgräns för hanteraren.
Du kan också avbryta spara-åtgärden oavsett felet i hanteraren eller inte använda metoden preventDefault i händelseargumentobjektet. Om den här metoden anropas väntar Async OnSave-händelsen på att alla löften ska kvittas, men spara sker inte. Att anropa den här metoden innebär att logiken i .then() & .catch() kommer att köras.
Händelsen OnSave väntar på ett löfte som returneras per hanterare. Om flera löften krävs rekommenderar vi att du omsluter alla löften i Promise.all() metoden och returnerar det enda resulterande löftet. För flera hanterare som alla returnerar ett löfte rekommenderar vi att du skapar en hanterare som anropar alla händelser och returnerar ett enda löfte som omsluter alla nödvändiga löften. Den här metoden är att minimera väntetiderna som orsakas av tidsgränsen.
Exempel: När du ska använda asynkrona OnSave-hanterare
Överväg att skapa en arbetsordertjänstuppgift där du måste verifiera att den valda kundtillgången har samma konto som anges i arbetsordern. Att hämta kontot i arbetsordern och kundtillgången är båda asynkrona processer och du måste slutföra båda innan du kan verifiera.
I det här scenariot, eftersom det finns flera asynkrona processer och båda anropen returnerar ett enda löfte, omsluter du båda i Promise.all() -metoden.
Anmärkning
Du kan bara använda preventDefault metoden synkront.
Till exempel:
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"));
});
}
Aktivera asynkrona OnSave-hanterare med hjälp av en appinställning
Om du vill använda asynkrona onSpara hanterare aktiverar du funktionen via en appinställning:
Gå till https://make.powerapps.com.
Se till att du väljer rätt miljö.
Välj Program i det vänstra navigeringsfönstret.
Välj appen, välj ... (ellipser) och välj sedan Redigera.
Välj Inställningar i kommandofältet.
När dialogrutan öppnas väljer du Funktioner.
Aktivera Async onSave-hanteraren.
Välj Spara.
Inaktivera asynkrona timeouter för OnSave-hanterare
När du använder en asynkron OnSave hanterare väntar formuläret på att löftet som returneras av hanteraren ska uppfyllas. För att säkerställa att formulärets sparande slutförs i tid genererar hanteraren ett timeout-undantag efter 10 sekunder för att låta dig veta att justera asynkron OnSave hanteraren för bättre prestanda.
Det finns scenarier där du behöver pausa hanteraren i OnSave mer än 10 sekunder. Ett exempel är att öppna en dialogruta och vänta på användarens indata innan du fortsätter att spara. Använd metoden disableAsyncTimeout för att säkerställa att asynkroniseringsåtgärden väntar på att löftet ska lösas.
Anmärkning
Du måste anropa disableAsyncTimeout innan några inväntningsinstruktioner eller asynkrona anrop.
Till exempel:
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 anropar disableAsyncTimeout tillämpas inte tidsgränsen för den hanteraren. Den fortsätter att vänta på att hanterarens löfte uppfylls.
Det här mönstret kan påverka hur formuläret sparas.
Relaterade artiklar
Grid OnSave-händelse
Händelser (klient-API-referens)
Händelser i formulär och rutnät i modellstyrda appar