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.
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 , i když se neuloží žádná změněná data.
- Kód spustí metodu formContext.data.entity.save , i když se neuloží žádná změněná data.
- 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 o aktivitách služby zruší operaci uložení a použije Book zprávu k zachování změny místo Create nebo Update. Z tohoto důvodu OnSavePostSave nebudou obslužné rutiny událostí pro tyto tabulky fungovat.
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.
Ukázkový scénář použití asynchronních obslužných rutin OnSave
Zvažte vytvoření úlohy služby pracovních objednávek. Musíte 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 je potřeba ho dokončit, aby mohlo dojít k ověření.
V tomto scénáři, protože existuje více asynchronních procesů a obě volání vrací jeden slib zabalením obou Promise.all() metod.
Poznámka:
Metodu preventDefault lze použít pouze synchronně.
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í Async OnSave pomocí nastavení aplikace
Pokud chcete používat asynchronní obslužné rutiny onSave, musíte ho povolit 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 a pak vyberte ... (tři tečky). 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.
Časové limity asynchronního ukládání
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, aby asynchronní operace čekala 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?" });
}
Při volání disableAsyncTimeout se časový limit pro tuto obslužnou rutinu nepoužije. Stále čeká na splnění slibu obslužné rutiny.
Tento vzor by se měl používat s opatrností, protože může mít vliv na 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