Udalosť OnSave pre formuláre (referenčné informácie o rozhraní API klienta) v modelom riadených aplikáciách

Táto OnSave udalosť sa vyskytne v nasledujúcich prípadoch:

  • Používateľ vyberie tlačidlo Uložiť alebo Obnoviť na paneli príkazov, a to aj v prípade, že sa nezmenili údaje, ktoré sa majú uložiť.
  • Kód spustí metódu formContext.data.entity.save , a to aj v prípade, že sa nezmenili údaje, ktoré sa majú uložiť.
  • Používateľ odíde z formulára a vo formulári sa nachádzajú neuložené údaje.
  • Možnosť Automatické ukladanie je povolená 30 sekúnd po zmene údajov a vo formulári sa nachádzajú neuložené údaje.
  • Kód spustí metódu formContext.data.save a vo formulári sú neuložené údaje.
  • Kód spustí metódu formContext.data.refresh , ktorá odovzdá hodnotu true ako prvý parameter a vo formulári sa nachádzajú neuložené údaje.

Poznámka

Záznamy OnSave o aktivite udalosti pre stretnutie, opakované stretnutie alebo službu zrušia operáciu ukladania a pomocou Book správy zachovajú zmenu namiesto Create alebo Update. Z tohto OnSave dôvodu a PostSave obsluhy udalostí pre tieto tabuľky nebudú fungovať.

Ak chcete zistiť, na ktoré tlačidlo sa použilo kliknutie na uloženie, použite metódu getSaveMode .

Akciu uloženia môžete zrušiť pomocou metódy preventDefault v rámci objektu argumentov udalosti. Metóda preventDefault je prístupná pomocou metódy getEventArgs, ktorá je súčasťou kontextu spustenia. Kontext spustenia sa automaticky odovzdá obsluhe udalostí formulára.

Podpora asynchrónnej obsluhy udalostí

Udalosť OnSave má možnosť počkať, kým obslužné programy udalostí vrátia sľuby, aby sa vyriešili pred uložením, čo umožňuje OnSave , aby udalosť bola asynchrónna ("asynchrónna").

Udalosť OnSave sa stane asynchrónnou, keď obsluha OnSave udalosti vráti sľub. Uloženie záznamu sa uskutoční po vyriešení každého sľubu vráteného obslužným programom. Pre všetky sľuby, ktoré sa vrátia, existuje 10-sekundový limit pre každý sľub, potom, čo platforma považuje sľuby za načasované. Tento časový limit sa použije na sľub. Ak máme napríklad vrátených päť sľubov, celkový čas čakania je 50 sekúnd.

Ak bude sľub zamietnutý alebo uplynul, operácia ukladania sa bude správať podobne ako aktuálne chyby skriptu. Ak sa vyskytne chyba skriptu alebo zamietnutý sľub alebo obslužný program, použite metódu preventDefault v rámci objektu argumentov udalosti v tomto konkrétnom obslužným programom, ak chcete zabrániť tomu, aby udalosť uloženia nastala.

Operáciu ukladania môžete tiež zrušiť bez ohľadu na chybu v obslužný program alebo nie pomocou metódy preventDefault v rámci objektu argumentov udalosti. Ak sa zavolá táto metóda, udalosť Async OnSave počká, kým sa všetky sľuby urovná, ale uloženie nenastane. Volanie tejto metódy znamená, že logika v rámci .then() funkcie & .catch() sa spustí.

Udalosť OnSave čaká na jeden sľub vrátený pre každú obsluhu. Ak sa vyžadujú viaceré sľuby, odporúča sa zabaliť všetky sľuby v metóde Promise.all() a vrátiť jeden výsledný sľub. Pre viaceré obslužné programy, ktoré vrátia sľub, odporúčame vytvoriť jeden obslužný program, ktorý vyvolá všetky udalosti a vráti jeden sľub, ktorý zabalí všetky požadované sľuby. Touto praxou je minimalizovať časy čakania spôsobené časovým limitom.

Príklad scenára, kedy použiť asynchrónne obslužné programy onSave

Zvážte vytvorenie úlohy služby pracovnej objednávky, musíte overiť, či má vybratá položka zákazníka rovnaké konto, ktoré je uvedené v pracovnej objednávke. Načítanie konta v službe Work Order a Customer Asset je asynchrónne procesy a je potrebné ho dokončiť ešte pred overením.

V tomto scenári, keďže existuje viacero asynchrónnych procesov, a obe volania vrátia jeden sľub zabalením oboch funkcií do Promise.all() metódy .

Poznámka

Metódu preventDefault možno použiť iba synchrónne.

Napríklad:

 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"));
   });
 }

Povolenie asynchrónnej funkcie OnSave pomocou nastavenia aplikácie

Ak chcete použiť asynchrónne obslužný program, treba ho povoliť prostredníctvom nastavenia aplikácie:

  1. Prejdite do systému https://make.powerapps.com.

  2. Uistite sa, že ste vybrali správne prostredie.

  3. Na ľavej navigačnej table vyberte položku Aplikácie.

  4. Vyberte aplikáciu a potom vyberte položku ... (tri bodky). Vyberte Upraviť.

  5. Na paneli príkazov vyberte položku Nastavenia .

  6. Keď sa otvorí dialógové okno, vyberte položku Funkcie.

  7. Zapnite asynchrónne zapnutie obslužného programu ukladania.

  8. Vyberte položku Uložiť.

    Nastavenie asynchrónnej aplikácie OnSave nastavenie Async

Asynchrónne časové limity onSave

Keď použijete asynchrónny OnSave obslužný program, formulár čaká, kým sa splnia sľub, ktorý vráti obslužný program. Aby sa zabezpečilo, že uloženie formulára sa dokončí včas, obslužný program zobrazí výnimku časového limitu po 10 sekundách, aby ste vedeli vyladiť asynchrónny OnSave obslužný program pre lepší výkon.

Existujú scenáre, v ktorých je potrebné pozastavenie obslužného OnSave programu na dlhšie ako 10 sekúnd. Príkladom je otvorenie dialógového okna a čakanie na zadanie používateľa, než bude pokračovať v ukladaní. Ak chcete skontrolovať, či asynchrónne operácie čakajú na vyriešenie sľubu, použite metódu disableAsyncTimeout .

Poznámka

Pred akýmkoľvek príkazom čakania alebo asynchrónnymi volaniami musíte zavolať disableAsyncTimeout .

Napríklad:

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?" });
 }

Keď sa zavolá hodnota disableAsyncTimeout , časový limit pre tento obslužný program sa nepoužije. Naďalej čaká na splnenie sľubu tohto obslužným programom.

Tento vzor by sa mal používať opatrne, pretože môže ovplyvniť výkon ukladania formulára.

Udalosť OnSave pre mriežky
Udalosti (odkaz na rozhranie API klienta)
Udalosti vo formulároch a mriežkach v aplikáciách riadených modelom