Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Událost formuláře OnSave v modelem řízených aplikacích umožňuje spouštět logiku, ověřovat data nebo zrušit uložení před uložením záznamu. K OnSave události dochází v následujících případech:
- Uživatel na panelu příkazů vybere tlačítko Uložit nebo Aktualizovat , a to i v případě, že se žádná změněná data neuloží.
- Kód spustí metodu formContext.data.entity.save , i když neexistují žádná změněná data k uložení.
- Uživatel přejde mimo formulář a ve formuláři jsou neuložené data.
- Možnost automatického ukládání je povolená, 30 sekund po změně dat a ve formuláři jsou neuložené data.
- Kód spustí metodu formContext.data.save a ve formuláři jsou neuložené data.
- Kód spustí metodu formContext.data.refresh, která předává hodnotu true jako první parametr a ve formuláři jsou neuložené data.
Poznámka:
Událost OnSave pro událost, opakovanou událost nebo záznamy aktivit služby zruší operaci uložení a použije Book zprávu k uložení změny místo Create nebo Update. Kvůli tomuto chování OnSave nefungují PostSave obslužné rutiny událostí pro tyto tabulky.
Chcete-li zjistit, na které tlačítko bylo kliknuto provést uložení, použijte getSaveMode metoda.
Akci uložení můžete zrušit pomocí metody preventDefault v rámci objektu argumentů události. Metoda preventDefault je přístupná pomocí metody getEventArgs , která je součástí kontextu spuštění. Kontext spuštění se automaticky předá obslužné rutině události formuláře.
Podpora asynchronní obslužné rutiny událostí
Událost OnSave má schopnost čekat na přísliby vrácené obslužnými rutinami událostí, aby se vyřešily před uložením, což umožňuje OnSave , aby událost byla asynchronní ("async").
Událost OnSave se stane asynchronní, když obslužná rutina OnSave události vrátí příslib. K uložení záznamu dojde, když se vyřeší každý příslib vrácený obslužnou rutinou. U všech vrácených příslibů existuje pro každý příslib 10sekundový limit, po který platforma považuje přísliby za vypršení časového limitu. Tento časový limit se použije pro každý příslib. Pokud například vrátíme pět příslibů, celková doba čekání je 50 sekund.
Pokud se příslib odmítne nebo vyprší časový limit, operace uložení se bude dál chovat podobně jako aktuální chyby skriptu. Použijte metodu preventDefault v objektu argumentů události v této konkrétní obslužné rutině, pokud chcete zabránit, aby k uložení události došlo v případě, že dojde k chybě skriptu nebo odmítnutí slibu nebo obslužné rutiny vyprší časový limit.
Operaci uložení můžete také zrušit bez ohledu na chybu v obslužné rutině nebo pomocí metody preventDefault v rámci objektu argumentů události. Pokud se tato metoda volá, událost Async OnSave čeká na vyřešení všech slibů, ale k uložení nedojde. Volání této metody znamená, že logika v rámci .then() a .catch() provede se.
Událost OnSave čeká na jeden příslib vrácený na obslužnou rutinu. Pokud je vyžadováno více příslibů, doporučujeme zabalit všechny přísliby v Promise.all() metodě a vrátit jediný výsledný příslib. U více obslužných rutin, které všechny vrací příslib, doporučujeme vytvořit jednu obslužnou rutinu, která volá všechny události, a vrátit jeden slib, který zabalí všechny požadované přísliby. Tento postup spočívá v minimalizaci doby čekání způsobené vypršením časového limitu.
Příklad: Kdy použít asynchronní obslužné rutiny OnSave
Zvažte vytvoření úlohy služby pracovního řádu, kde potřebujete ověřit, že vybraný prostředek zákazníka má stejný účet uvedený v pracovním pořadí. Načtení účtu pro pracovní objednávku a prostředek zákazníka jsou asynchronní procesy a před ověřením je nutné provést obojí.
V tomto scénáři, protože existuje více asynchronních procesů a obě volání vrací jeden slib, zabalte obě Promise.all() metody.
Poznámka:
Synchronně můžete použít pouze metodu preventDefault .
Napří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"));
});
}
Povolení asynchronních obslužných rutin OnSave pomocí nastavení aplikace
Pokud chcete použít asynchronní obslužné rutiny onSave, zapněte tuto funkci prostřednictvím nastavení aplikace:
Přejděte na https://make.powerapps.com .
Ujistěte se, že jste vybrali správné prostředí.
V levém navigačním podokně vyberte položku Aplikace.
Vyberte aplikaci, vyberte ... (tři tečky) a pak vyberte Upravit.
Na panelu příkazů vyberte Nastavení .
Po otevření dialogového okna vyberte Funkce.
Zapněte obslužnou rutinu Async onSave.
Vyberte Uložit.
Zakázání časových limitů asynchronní obslužné rutiny OnSave
Když použijete asynchronní OnSave obslužnou rutinu, formulář čeká na splnění příslibu vráceného obslužnou rutinou. Aby se zajistilo, že se uložení formuláře dokončí včas, obslužná rutina vyvolá výjimku časového limitu po 10 sekundách, abyste věděli, že chcete vyladit asynchronní OnSave obslužnou rutinu pro lepší výkon.
Existují scénáře, kdy je potřeba pozastavení obslužné rutiny OnSave po dobu delší než 10 sekund. Příkladem je otevření dialogového okna a čekání na vstup uživatele před pokračováním v uložení. Pokud chcete zajistit, že asynchronní operace čeká na vyřešení příslibu, použijte metodu disableAsyncTimeout .
Poznámka:
Před libovolnými příkazy await nebo asynchronními voláními je nutné volat disableAsyncTimeout .
Napří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?" });
}
Když zavoláte disableAsyncTimeout, časový limit pro tuto obslužnou rutinu se nepoužije. Stále čeká na splnění slibu obslužné rutiny.
Tento model může ovlivnit výkon ukládání formuláře.
Související články
Událost OnSave služby Grid
Události (reference k rozhraní API klienta)
Události ve formulářích a mřížkách v modelem řízených aplikacích