Dalintis per


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

Įvykis OnSave įvyksta, kai:

  • Vartotojas komandų juostoje pasirenka mygtuką Įrašyti arba Atnaujinti , net jei nėra įrašytų pakeistų duomenų.
  • Kodas vykdo formContext.data.entity.save metodą, net jei nėra įrašytų pakeistų 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.

Paskyros OnSave , pasikartojančios paskyros ar tarnybos veiklos įrašų įvykis atšauks įrašymo operaciją ir naudos Book pranešimą, kad būtų išsaugotas keitimas, o ne Create arba Update. Dėl to OnSavePostSave šių lentelių įvykių apdorojimo programos neveiks.

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. PreventDefault metodas pasiekiamas 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.

Example scenario on when to use async OnSave handlers

Apsvarstykite galimybę sukurti darbo užsakymo paslaugos užduotį, turite patikrinti, ar pasirinktas kliento turtas turi tą patį abonementą, nurodytą darbo užsakyme. Gaunama darbo užsakymo ir kliento išteklių paskyra yra asinchroniniai procesai ir juos reikia užbaigti, kad būtų galima atlikti tikrinimą.

Tokiu atveju, kadangi yra keli "async" procesai ir abu skambučiai pateikia vieną pažadą keliant abu Promise.all() metodo veiksmus.

Pastaba.

Metodą preventDefault galima naudoti 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" naudojant programėlės parametrą

Norėdami naudoti "async" onSave apdorojimo programas, turite ją įjungti naudodami taikomosios 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ę, tada pasirinkite ... (daugtaškis). 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.

    Async OnSave app setting

Async OnSave timeouts

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 po 10 sekundžių pateiks skirtojo laiko išimtį, kad žinotumėte, kaip 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 įsitikinti, 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škvietus disableAsyncTimeout , tos apdorojimo programos skirtasis laikas netaikomas. Ji ir toliau laukia, kol bus įvykdytas tos apdorojimo programos pažadas.

Šį šabloną reikia naudoti atsargiai, nes jis 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