Napomena
Za pristup ovoj stranici potrebna je autorizacija. Možete se pokušati prijaviti ili promijeniti direktorije.
Za pristup ovoj stranici potrebna je autorizacija. Možete pokušati promijeniti direktorije.
Događaj OnSave se odvija u sljedećem slučaju:
- Korisnik odabire gumb Spremi ili Osvježi na naredbenoj traci, čak i kada nema promijenjenih podataka za spremanje.
- Kod izvršava metodu formContext.data.entity.save , čak i kada nema promijenjenih podataka za spremanje.
- Korisnik se kreće od obrasca i u obrascu postoje nespremljeni podaci.
- Mogućnost automatskog spremanja je omogućena, 30 sekundi nakon promjene podataka i nespremljenih podataka u obrascu.
- Kod izvršava metodu formContext.data.save i u obrascu se nalaze podaci koji nisu spremljeni.
- Kod izvršava metodu formContext.data.refresh koja prenosi true vrijednost kao prvi parametar, a u obrascu se nalaze podaci koji nisu spremljeni.
Napomena
Događaj OnSave za obvezu, ponavljajuću obvezu ili zapise Book o aktivnosti servisa otkazat će operaciju spremanja i koristiti poruku za trajnu promjenu, a ne Create ili Update. Zbog toga rukovatelj OnSavePostSave događajima za te tablice neće funkcionirati.
Da biste odredili koji je gumb klikan za izvođenje spremanja, koristite metodu getSaveMode .
Akciju spremanja možete otkazati pomoću metode preventDefault unutar objekta argumenata događaja. Metoda preventDefault dostupna je pomoću metode getEventArgs koja je dio konteksta izvršavanja. Kontekst izvršavanja automatski se prosljeđuje rukovatelj događajima obrasca.
Podrška za rukovatelj asinkronim događajima
Događaj OnSave ima mogućnost čekanja na obećanja koja su vratili rukovatelji događajima da se podmire prije spremanja, OnSave što omogućuje asinkrono ("asinkrono").
Događaj OnSave postaje asinkroan kada OnSave rukovatelj događajima vrati obećanje. Spremanje zapisa događa se kada se razriješi svako obećanje koje vrati rukovatelj. Za sva vraćena obećanja postoji ograničenje od 10 sekundi za svako obećanje, nakon što platforma smatra da je vremensko ograničenje obećanja premašeno. Ovo prekoračenje vremena primjenjuje se po obećanju. Ako, primjerice, imamo pet vraćenih obećanja, ukupno vrijeme čekanja iznosi 50 sekundi.
Ako je obećanje odbijeno ili je prekoračenje vremena premašeno, operacija spremanja i dalje se ponaša slično kao pogreškama u trenutnoj skripti. Koristite metodu preventDefault unutar objekta argumenata događaja u tom određenom rukovatelj ako želite spriječiti događaj spremanja ako postoji pogreška skripte /odbijeno obećanje ili rukovatelj je došlo do prekida.
Operaciju spremanja možete otkazati neovisno o pogrešci u rukovatelju ili ne koristeći metodu preventDefault unutar objekta argumenata događaja. Ako se ta metoda zove, događaj Async OnSave pričekat će da se sva obećanja podmire, ali se spremanje neće dogoditi. Pozivanje ove metode znači da će se logika unutar .then() funkcije & .catch() izvršiti.
Događaj OnSave čeka da se jedno obećanje vrati po rukovatelj. Ako je potrebno više obećanja, preporučuje se da zamotate sva obećanja Promise.all() u metodi i vratite jedno dobiveno obećanje. Za više rukovatelja koji vraćaju obećanje preporučujemo da stvorite jednog rukovatelja koji poziva sve događaje i vrati jedno obećanje koje završava sva obavezna obećanja. Ova je praksa minimiziranje vremena čekanja uzrokovanih prekoračenjima vremena čekanja.
Example scenario on when to use async OnSave handlers
Razmislite o stvaranju zadatka servisnog naloga, morate provjeriti ima li odabrano sredstvo klijenta isti račun naveden u poslovnom nalogu. Dohvaćanje računa na radnoj narudžbi i resursu korisnika asinkroni su procesi i moraju se dovršiti prije nego što se provjera valjanosti može izvršiti.
U ovom scenariju, budući da postoji više asinkronih procesa, a oba poziva vraćaju jedno obećanje omatanjem oba u metodi Promise.all() .
Napomena
Metoda preventDefault se može koristiti samo sinkronizirano.
Na primjer:
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"));
});
}
Omogućivanje sinkronizacije prilikom spremanja pomoću postavke aplikacije
Da biste koristili asinkrone rukovatelja prilikom spremanja, morate ga omogućiti putem postavke aplikacije:
Idite na https://make.powerapps.com.
Provjerite jeste li odabrali odgovarajuće okruženje.
U lijevom navigacijskom oknu odaberite Aplikacije.
Odaberite aplikaciju, a zatim ... (trotočje). Odaberite Uredi.
Na naredbenoj traci odaberite Postavke.
Kada se dijaloški okvir otvori, odaberite Značajke.
Uključite Async onSave handler.
Odaberite Spremi.
Prekoračenja vremena sinkronizacije prilikom spremanja
Kada koristite asinkroni OnSave rukovatelj, obrazac čeka da se ispuni obećanje koje je vratio rukovatelj. Da bi se ušteda obrasca dovršila na vrijeme, rukovatelj će prikazati iznimku prekoračenja vremena nakon 10 OnSave sekundi da bi vas obavijestio da ugodite asinkroni rukovatelj radi boljih performansi.
Postoje scenariji u kojima je potrebno OnSave pauziranje rukovatelja dulje od 10 sekundi. Primjer je otvaranje dijaloškog okvira i čekanje korisnikova unosa prije nastavka spremanja. Da biste provjerili čeka li asinkronizirana operacija da se obećanje riješi, upotrijebite metodu disableAsyncTimeout .
Napomena
Morate se pozvati prije disableAsyncTimeout svih naredbi čekanja ili asinkronih poziva.
Na primjer:
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?" });
}
Kada se poziva disableAsyncTimeout , ne primjenjuje se vremensko ograničenje za tog rukovatelja. I dalje čeka da se ispunjeno obećanje tog rukovatelja.
Taj uzorak treba koristiti uz oprez jer može utjecati na performanse spremanja obrasca.
Povezani članci
Događaj onsave rešetke
Događaji (referenca za API klijenta)
Događaji u obrascima i rešetkama u aplikacijama utemeljenim na modelu