Form OnSave event (Client API reference) in model-driven apps

Formos OnSave įvykis modeliu pagrįstose programose leidžia paleisti logiką, tikrinti duomenis arba atšaukti įrašymą prieš įrašant įrašą. Įvykis OnSave įvyksta, kai:

  • Vartotojas komandų juostoje pasirenka mygtuką Įrašyti arba Atnaujinti , net jei nėra pakeistų įrašytų duomenų.
  • Kodas vykdo formContext.data.entity.save metodą, net jei nėra pakeistų įrašytų duomenų.
  • Vartotojas pereina nuo formos ir formoje yra neįrašytų duomenų.
  • Automatinio įrašymo parinktis įjungta, praėjus 30 sekundžių po duomenų keitimo ir formoje yra neįrašytų duomenų.
  • Kodas vykdo formContext.data.save metodą ir formoje yra neįrašytų duomenų.
  • Kodas vykdo formContext.data.refresh metodą, perduodantį teisingą reikšmę kaip pirmąjį parametrą, ir formoje yra neįrašytų duomenų.

Pastaba.

PaskyrosOnSave, pasikartojančios paskyros arba tarnybos veiklos įrašų įvykis atšaukia įrašymo operaciją ir naudoja Book pranešimą, kad įrašytų keitimą, o Create ne arba .Update Dėl šio veikimo būdo OnSavePostSave šių lentelių įvykių apdorojimo programos neveikia.

Norėdami nustatyti, kuris mygtukas buvo spustelėtas norint atlikti įrašymą, naudokite metodą getSaveMode .

Įrašymo veiksmą galite atšaukti naudodami metodą preventDefault įvykio argumentų objekte. Metodas preventDefaultpasiekiamas naudojant getEventArgs metodą, kuris yra vykdymo konteksto dalis. Vykdymo kontekstas automatiškai perduodamas formos įvykio apdorojimo programai.

Asinchroninių įvykių apdorojimo programos palaikymas

OnSave įvykis turi galimybę laukti, kol įvykių apdorojimo programų pateikti pažadai bus išspręsti prieš įrašant, leidžiant OnSave įvykiui būti asinchroniniam ("async").

Įvykis OnSave tampa async, kai įvykio apdorojimo OnSave programa pateikia pažadą. Įrašo įrašymas įvyksta, kai išsprendžiamas kiekvienas apdorojimo programos grąžintas pažadas. Visiems grąžinamiems pažadams taikomas 10 sekundžių apribojimas kiekvienam pažadui, po to platforma mano, kad pažadams skirtasis laikas baigėsi. Šis skirtasis laikas taikomas vienam pažadui. Pavyzdžiui, jei gavome penkis pažadus, bendras laukimo laikas yra 50 sekundžių.

Jei pažadas atmetamas arba jo skirtasis laikas baigėsi, įrašymo operacija ir toliau veikia panašiai kaip dabartinės scenarijaus klaidos. Naudokite preventDefault metodą įvykio argumentų objekte toje konkrečioje apdorojimo programoje, jei norite išvengti įrašymo įvykio, jei yra scenarijaus klaida / atmestas pažadas arba baigėsi apdorojimo programos laikas.

Taip pat galite atšaukti įrašymo operaciją neatsižvelgiant į apdorojimo programos klaidą arba nenaudodami preventDefault metodo įvykio argumentų objekte. Jei šis metodas iškviečiamas, įvykis "Async OnSave" laukia, kol bus išspręsti visi pažadai, tačiau įrašymas neįvyks. Iškviečiant šį metodą, bus vykdoma logika iš .then() "" .catch() .

Įvykis OnSave laukia vieno pažado, grąžinto kiekvienai apdorojimo programai. Jei reikia kelių pažadų, rekomenduojama suvynioti visus metodo pažadus Promise.all() ir grąžinti vieną gautą pažadą. Kelių apdorojimo programų, kurios visi pateikia pažadą, atveju rekomenduojame sukurti vieną apdorojimo programą, kuri iškviečia visus įvykius, ir pateikti vieną pažadą, kuris kelia visus reikalingus pažadus. Ši praktika yra sumažinti laukimo laiką, kurį sukėlė skirtasis laikas.

Pavyzdys: Kada naudoti "async OnSave" apdorojimo programas

Apsvarstykite galimybę sukurti darbo užsakymo tarnybos užduotį, kai reikia patikrinti, ar pasirinktas kliento išteklius turi tą pačią sąskaitą, nurodytą darbo užsakyme. Gaunama darbo užsakymo ir kliento išteklių paskyra yra asinchroniniai procesai ir reikia atlikti abu veiksmus, kad galėtumėte patvirtinti.

Tokiu atveju, kadangi yra keli "async" procesai ir abu iškviečia, pateikia vieną pažadą Promise.all() , įterpkite abu metodus.

Pastaba.

Metodą galite naudoti preventDefault tik sinchroniškai.

Pavyzdys.

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

Įjungti "async OnSave" apdorojimo programas naudojant programos parametrą

Norėdami naudoti "async" onSave apdorojimo programas, įjunkite funkciją naudodami programos parametrą:

  1. Eikite į https://make.powerapps.com.

  2. Įsitikinkite, kad pasirinkote tinkamą aplinką.

  3. Kairiojoje naršymo srityje pasirinkite Programos .

  4. Pasirinkite programėlę, pasirinkite ... (daugtaškis), tada pasirinkite Redaguoti.

  5. Komandų juostoje pasirinkite Parametrai .

  6. Kai bus atidarytas dialogo langas, pasirinkite Funkcijos.

  7. Įjunkite "Async", kad įjungtumėte įrašymo apdorojimo programą.

  8. Pasirinkite Įrašyti.

    Programėlės parametrų dialogo lange įjungto

Išjungti "async OnSave" apdorojimo programos skirtąjį laiką

Kai naudojate sinchronizavimo OnSave apdorojimo programą, forma laukia, kol bus įvykdytas apdorojimo programos grąžintas pažadas. Siekiant užtikrinti, kad formos įrašymas baigtas laiku, apdorojimo programa pateikia skirtojo laiko išimtį po 10 sekundžių, kad žinotumėte, jog reikia sureguliuoti "async OnSave " apdorojimo programą, kad našumas būtų geresnis.

Yra scenarijų, kai pristabdant apdorojimo OnSave programą reikia ilgiau nei 10 sekundžių. Pavyzdžiui, prieš įrašant atidaromas dialogo langas ir laukiama vartotojo įvesties. Norėdami užtikrinti, kad sinchronizavimo operacija laukia pažado sprendimo, naudokite metodą disableAsyncTimeout .

Pastaba.

Turite paskambinti disableAsyncTimeout prieš laukiant sakinių ar "async" skambučių.

Pavyzdys.

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

Iškviečiant disableAsyncTimeout, tos apdorojimo programos skirtasis laikas netaikomas. Ji ir toliau laukia, kol bus įvykdytas tos apdorojimo programos pažadas.

Šis modelis gali turėti įtakos formos įrašymo našumui.

Tinklelio įrašymo įvykis
Įvykiai (kliento API nuoroda)
Įvykiai formose ir tinkleliuose modeliu pagrįstose programose