Notă
Accesul la această pagină necesită autorizare. Puteți încerca să vă conectați sau să modificați directoarele.
Accesul la această pagină necesită autorizare. Puteți încerca să modificați directoarele.
Evenimentul OnSave are loc atunci când:
- Utilizatorul selectează butonul Salvare sau Reîmprospătare din bara de comenzi, chiar și atunci când nu există date modificate de salvat.
- Codul execută metoda formContext.data.save, chiar și atunci când nu există date modificate de salvat.
- Utilizatorul navighează departe de formular și există date nesalvate în formular.
- Opțiunea Salvare automată este activată, la 30 de secunde după ce datele s-au modificat și există date nesalvate în formular.
- Codul execută metoda formContext.data.save și există date nesalvate în formular.
- Codul execută metoda formContext.data.refresh care transmite o valoare adevărată ca prim parametru și există date nesalvate în formular.
Notă
Evenimentul pentru înregistrările OnSave rezervării, rezervării recurente sau ale activității serviciului va anula operațiunea de salvare și va utiliza Book mesajul pentru a persista modificarea, nu Create sau Update. Din acest motiv, OnSave iar PostSave rutinele de tratare a evenimentelor pentru aceste tabele nu vor funcționa.
Pentru a determina ce buton s-a făcut clic pentru a efectua salvarea, utilizați metoda getSaveMode .
Puteți anula acțiunea de salvare utilizând metoda preventDefault din obiectul argumentelor evenimentului. Metoda preventDefault este accesibilă utilizând metoda getEventArgs care face parte din contextul de execuție. Contextul de execuție este transmis automat rutinei de tratare a evenimentelor de formular.
Suport pentru rutina de tratare a evenimentelor asincronă
Evenimentul OnSave are capacitatea de a aștepta promisiunile returnate de rutinele de tratare a evenimentelor pentru a se stabili înainte de salvare, permițând OnSave evenimentului să fie asincron ("asincron").
Evenimentul OnSave devine asincron atunci când rutina de tratare a OnSave evenimentului returnează o promisiune. Salvarea înregistrării are loc atunci când fiecare promisiune returnată de o rutină de tratare este rezolvată. Pentru orice promisiuni returnate, există o limită de 10 secunde pentru fiecare promisiune, după ce platforma consideră că promisiunile vor fi expirate. Această expirare se aplică pentru fiecare promisiune. De exemplu, dacă avem cinci promisiuni returnate, timpul total de așteptare este de 50 de secunde.
Dacă promisiunea este respinsă sau a expirat, operațiunea de salvare continuă să se comporte similar cu erorile de script curente. Utilizați metoda preventDefault din obiectul argumentelor evenimentului în acel rutină de tratare, dacă doriți să împiedicați ca evenimentul de salvare să se întâmple dacă există o eroare de script/o promisiune respinsă sau o rutină de tratare este dezactivată.
De asemenea, puteți să anulați operațiunea de salvare indiferent de eroarea din rutina de tratare sau să nu utilizați metoda preventDefault din obiectul cu argumente eveniment. Dacă se apelează această metodă, evenimentul Async OnSave așteaptă toate promisiunile de a se stabili, dar salvarea nu va avea loc. Apelarea acestei metode înseamnă logica din & .then().catch() se va executa.
Evenimentul OnSave așteaptă o promisiune returnată pentru fiecare rutină de tratare. Dacă sunt necesare mai multe promisiuni, se recomandă să încadrați toate promisiunile în Promise.all() metodă și să returnați promisiunea rezultată. Pentru mai multe rutine de tratare care returnează o promisiune, vă recomandăm să creați o rutină de tratare care apelează toate evenimentele și să returnați o singură promisiune care încadrează toate promisiunile necesare. Această practică este să minimizați timpul de așteptare provocat de expirare.
Example scenario on when to use async OnSave handlers
Luați în considerare crearea unei activități serviciu comandă de lucru, trebuie să validați că activul client selectat are același cont listat în Comanda de lucru. Preluarea contului din Comanda de lucru și Activul pentru clienți sunt atât procese asincrone, cât și trebuie finalizate înainte de a putea apărea validarea.
În acest scenariu, deoarece există mai multe procese asincronate și ambele apeluri returnează o singură promisiune, încadrându-le pe ambele în Promise.all() metodă.
Notă
Metoda preventDefault poate fi utilizată doar sincronizat.
De exemplu:
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"));
});
}
Activați Async OnSave utilizând setarea aplicației
Pentru a utiliza rutine de tratare asincronate, trebuie să o activați printr-o setare de aplicație:
Salt la https://make.powerapps.com.
Asigurați-vă că selectați mediul corect.
Selectați Aplicații din panoul de navigare din stânga.
Selectați aplicația, apoi selectați ... (puncte de suspensie). Selectați Editare.
Selectați Setări din bara de comenzi.
Atunci când se deschide caseta de dialog, selectați Caracteristici.
Activați Async onSave handler.
Selectați Salvați.
Temporizări onSave asincrone
Atunci când utilizați o rutină de tratare asincronă OnSave , formularul așteaptă ca promisiunea returnată de rutină să fie îndeplinită. Pentru a vă asigura că salvarea formularului se termină la timp, rutina de tratare va genera o excepție de expirare după 10 secunde pentru a vă informa să reglați rutina de tratare asincronă OnSave pentru o performanță mai bună.
Există scenarii în care este necesară întreruperea rutinei de OnSave tratare pentru mai mult de 10 secunde. Un exemplu deschide o casetă de dialog și așteaptă intrarea utilizatorului înainte de a continua să salveze. Pentru a vă asigura că operațiunea asincronă așteaptă ca promisiunea să se rezolve, utilizați metoda disableAsyncTimeout .
Notă
Trebuie să apelați disableAsyncTimeout înainte de orice instrucțiune sau apeluri asincronate.
De exemplu:
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?" });
}
Atunci când se apelează disableAsyncTimeout , timpul de expirare pentru rutina de tratare nu se aplică. Continuă să aștepte ca promisiunea rutinei de tratare să fie îndeplinită.
Acest model ar trebui utilizat cu atenție, deoarece ar putea afecta performanța salvării formularului.
Articole asociate
Grilă Eveniment OnSave
Evenimente (Referință API client)
Evenimente în formulare și grile în aplicații bazate pe model