Događaj Prilikom spremanja obrasca (referenca za API klijenta) u aplikacijama utemeljenima na modelu

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:

  1. Idite na https://make.powerapps.com.

  2. Provjerite jeste li odabrali odgovarajuće okruženje.

  3. U lijevom navigacijskom oknu odaberite Aplikacije.

  4. Odaberite aplikaciju, a zatim ... (trotočje). Odaberite Uredi.

  5. Na naredbenoj traci odaberite Postavke.

  6. Kada se dijaloški okvir otvori, odaberite Značajke.

  7. Uključite Async onSave handler.

  8. Odaberite Spremi.

    Postavka aplikacije Asinkronno prilikom spremanja

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.

Događaj onsave rešetke
Događaji (referenca za API klijenta)
Događaji u obrascima i rešetkama u aplikacijama utemeljenim na modelu