Muistiinpano
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää kirjautua sisään tai vaihtaa hakemistoa.
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää vaihtaa hakemistoa.
Mallipohjaisten sovellusten lomaketapahtuman OnSave avulla voit suorittaa logiikan, vahvistaa tietoja tai peruuttaa tallennuksen ennen tietueen tallentamista. Tapahtuma OnSave ilmenee seuraavissa tilanteissa:
- Käyttäjä valitsee komentopalkista Tallenna - tai Päivitä-painikkeen , vaikka tallennettavaa tietoa ei olisikaan muutettu.
- Code suorittaa formContext.data.entity.save-menetelmän , vaikka tallennettavaa tietoa ei olisi muutettu.
- Käyttäjä siirtyy pois lomakkeesta ja lomakkeessa on tallentamattomia tietoja.
- Automaattinen tallennus -asetus on käytössä 30 sekunnin kuluttua tietojen muuttumisesta ja lomakkeella on tallentamattomia tietoja.
- Koodi suorittaa formContext.data.save-menetelmän , ja lomakkeella on tallentamattomia tietoja.
- Code suorittaa formContext.data.refresh-menetelmän välittämällä tosi-arvon ensimmäisenä parametrina, ja lomakkeessa on tallentamattomia tietoja.
Note
TapaamisenOnSave, toistuvan tapaamisen tai palveluaktiviteetin tietueiden tapahtuma peruuttaa tallennustoiminnon ja Book käyttää viestiä muutoksen tallentamiseen kohteen tai Updatesijaan.Create Tämän vuoksi OnSavePostSave näiden taulukoiden tapahtumakäsittelijät eivät toimi.
Voit selvittää, mitä painiketta napsautettiin tallennuksen suorittamiseksi, käyttämällä getSaveMode-menetelmää .
Voit peruuttaa tallenna-toiminnon käyttämällä preventDefault-menetelmää tapahtumaargumentit-objektissa. - preventDefault menetelmä on käytettävissä getEventArgs-menetelmällä , joka on osa suorituskontekstia. Suorituskonteksti välitetään automaattisesti lomakkeen tapahtumakäsittelijälle.
Asynkronisen tapahtumakäsittelijän tuki
OnSave-tapahtuma pystyy odottamaan tapahtumakäsittelijöiden palauttamia lupauksia sopimaan ennen tallentamista, jolloin OnSave tapahtuma on asynkroninen ("asynkroninen").
Tapahtumasta OnSave tulee asynkroninen, OnSave kun tapahtumakäsittelijä palauttaa lupauksen. Tietueen tallentaminen tapahtuu, kun jokainen käsittelijän palauttama lupaus ratkaistaan. Kaikille palautetuille lupauksille on 10 sekunnin raja kullekin lupaukselle, sen jälkeen alusta harkitsee aikakatkaisua. Tätä aikakatkaisua sovelletaan lupausta kohti. Esimerkiksi jos meillä on viisi lupausta palautettuna, odotusaika on yhteensä 50 sekuntia.
Jos lupaus hylätään tai aikakatkaistaan, tallennustoiminto toimii edelleen samalla tavalla kuin nykyiset komentosarjavirheet. Käytä preventDefault-menetelmää tapahtumaargumenttien objektissa kyseisessä käsittelijässä, jos haluat estää tallennustapahtuman toteutumisen, jos komentosarjavirhe/hylätty lupaus tai käsittelijä aikakatkaistaan.
Voit myös peruuttaa tallennustoiminnon riippumatta käsittelijän virheestä tai olla käyttämättä preventDefault-menetelmää tapahtumaargumenttien objektissa. Jos tätä menetelmää kutsutaan, Async OnSave -tapahtuma odottaa kaikkia lupauksia, mutta pelastusta ei tapahdu. Tämän menetelmän kutsuminen tarkoittaa , että kohteen & .then().catch() logiikka suoritetaan.
Tapahtuma OnSave odottaa yhtä lupaa, joka palautetaan käsittelijää kohti. Jos useita lupauksia vaaditaan, on suositeltavaa rivittää kaikki menetelmän Promise.all() lupaukset ja palauttaa yksittäinen tulokseksi saatava lupaus. Useille käsittelijöille, jotka kaikki palauttavat lupauksen, suosittelemme luomaan yhden käsittelijän, joka kutsuu kaikki tapahtumat, ja palauttamaan yhden lupauksen, joka rivittää kaikki vaaditut lupaukset. Tämä käytäntö on minimoida aikakatkaisun aiheuttamat odotusajat.
Esimerkki: Milloin kannattaa käyttää asynkronisia OnSave-käsittelijöitä
Harkitse työtilauksen palvelutehtävän luomista, kun sinun on vahvistettava, että valitulla asiakkaan resurssilla on sama tili, joka on lueteltu työtilauksessa. Työtilauksen ja Asiakasresurssin tilin noutaminen on asynkronista prosessia, ja sinun on suoritettava molemmat ennen vahvistamista.
Tässä skenaariossa, koska on olemassa useita asynkronisia prosesseja ja molemmat kutsut palauttavat yhden lupauksen, rivitä molemmat menetelmään Promise.all() .
Note
Voit käyttää -menetelmää preventDefault vain synkronisesti.
Esimerkki:
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"));
});
}
Asynkronisen OnSave-käsittelijän käyttöönotto sovellusasetuksen avulla
Jos haluat käyttää asynkronista onSave-käsittelijää, ota ominaisuus käyttöön sovellusasetuksen kautta:
Siirry kohteeseen https://make.powerapps.com.
Varmista, että valitset oikean ympäristön.
Valitse vasemmassa siirtymisruudussa Sovellukset.
Valitse sovellus, valitse ... (kolme pistettä) ja valitse sitten Muokkaa.
Valitse komentopalkista Asetukset .
Kun valintaikkuna avautuu, valitse Ominaisuudet.
Ota Async onSave-käsittelijä käyttöön.
Valitse Tallenna.
Poista asynkroninen OnSave-käsittelijän aikakatkaisut käytöstä
Kun käytät asynkronista OnSave käsittelijää, lomake odottaa käsittelijän palauttaman lupauksen täyttämistä. Sen varmistamiseksi, että lomake tallennetaan ajallaan, käsittelijä aiheuttaa aikakatkaisupoikkeuksen 10 sekunnin kuluttua kertoakseen asynkronisen OnSave käsittelijän hienosäätöön suorituskyvyn parantamiseksi.
On tilanteita, joissa käsittelijän OnSave keskeyttäminen kestää yli 10 sekuntia. Esimerkki on valintaikkunan avaaminen ja odottaminen käyttäjän syötettä ennen tallentamisen jatkamista. Varmista, että asynkroninen toiminto odottaa lupauksen ratkaisemista, käyttämällä disableAsyncTimeout-menetelmää .
Note
Sinun on kutsuttava disableAsyncTimeout ennen odottavia lausuntoja tai asynkronisia kutsuja.
Esimerkki:
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?" });
}
Kun kutsut disableAsyncTimeout-toiminnon, kyseisen käsittelijän aikakatkaisua ei käytetä. Se odottaa edelleen, että käsittelijän lupaus täyttyy.
Tämä malli voi vaikuttaa lomakkeen tallentamisen suorituskykyyn.
Liittyvät artikkelit
Ruudukon OnSave-tapahtuma
Tapahtumat (asiakasohjelman ohjelmointirajapinnan viittaus)
Mallimuotoisten sovellusten lomakkeiden ja ruudukoiden tapahtumat