Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zdarzenie formularza OnSave w aplikacjach opartych na modelu umożliwia uruchamianie logiki, weryfikowanie danych lub anulowanie zapisywania przed zapisaniem rekordu. Zdarzenie OnSave występuje, gdy:
- Użytkownik wybiera przycisk Zapisz lub Odśwież na pasku poleceń, nawet jeśli nie ma zmienionych danych do zapisania.
- Kod wykonuje metodę formContext.data.entity.save , nawet jeśli nie ma zmienionych danych do zapisania.
- Użytkownik przechodzi z dala od formularza i w formularzu znajdują się niezapisane dane.
- Opcja Autozapis jest włączona, 30 sekund po zmianie danych i w formularzu są niezapisane dane.
- Kod wykonuje metodę formContext.data.save i w formularzu znajdują się niezapisane dane.
- Kod wykonuje metodę formContext.data.refresh przekazując wartość true jako pierwszy parametr i w formularzu znajdują się niezapisane dane.
Uwaga / Notatka
Zdarzenie OnSavedla terminu, terminu cyklicznego lub rekordy działania usługi anuluje operację zapisywania i używa komunikatu Book do zapisania zmiany zamiast Create lub Update. Ze względu na to zachowanie OnSave programy PostSave obsługi zdarzeń dla tych tabel nie działają.
Aby określić, który przycisk został kliknięty w celu wykonania zapisu, użyj metody getSaveMode .
Możesz anulować akcję zapisywania przy użyciu metody preventDefault w obiekcie argumentów zdarzeń. Metoda preventDefault jest dostępna przy użyciu metody getEventArgs , która jest częścią kontekstu wykonywania. Kontekst wykonywania jest automatycznie przekazywany do programu obsługi zdarzeń formularza.
Obsługa asynchronicznej obsługi zdarzeń
Zdarzenie OnSave może czekać na obietnice zwrócone przez programy obsługi zdarzeń do rozliczenia przed zapisaniem, co pozwala na OnSave asynchroniczne zdarzenie ("asynchroniczne").
Zdarzenie OnSave staje się asynchroniczne, gdy OnSave program obsługi zdarzeń zwraca obietnicę. Zapisywanie rekordu odbywa się, gdy każda obietnica zwrócona przez program obsługi jest rozpoznawana. W przypadku wszelkich obietnic, które zostaną zwrócone, istnieje limit 10 sekund dla każdej obietnicy, po tym jak platforma uważa, że zostanie przekroczony limit czasu. Ten limit czasu jest stosowany na obietnicę. Jeśli na przykład zostanie zwróconych pięć obietnic, łączny czas oczekiwania wynosi 50 sekund.
Jeśli obietnica zostanie odrzucona lub upłynął limit czasu, operacja zapisywania będzie nadal zachowywać się podobnie do bieżących błędów skryptu. Użyj metody preventDefault w obiekcie argumentów zdarzeń w tej konkretnej procedurze obsługi, jeśli chcesz zapobiec wystąpieniu zdarzenia zapisywania, jeśli występuje błąd skryptu/odrzucona obietnica lub procedura obsługi przekroczyła limit czasu.
Można również anulować operację zapisywania niezależnie od błędu w procedurze obsługi lub nie używać metody preventDefault w obiekcie argumentów zdarzeń. Jeśli ta metoda jest wywoływana, zdarzenie Async OnSave czeka na wszystkie obietnice do rozliczenia, ale zapisywanie nie zostanie wykonane. Wywołanie tej metody oznacza, że logika w obiekcie .then() i .catch() zostanie wykonana.
Zdarzenie OnSave czeka na jedną obietnicę zwróconą dla procedury obsługi. Jeśli wymagane jest wiele obietnic, zaleca się opakowywanie wszystkich obietnic w metodzie Promise.all() i zwracanie pojedynczej wynikowej obietnicy. W przypadku wielu procedur obsługi, które zwracają obietnicę, zalecamy utworzenie jednej procedury obsługi, która wywołuje wszystkie zdarzenia i zwraca pojedynczą obietnicę, która opakowuje wszystkie wymagane obietnice. Ta praktyka polega na zminimalizowaniu czasów oczekiwania spowodowanych przekroczeniem limitu czasu.
Przykład: kiedy należy używać asynchronicznych programów obsługi OnSave
Rozważ utworzenie zadania usługi zamówienia pracy, w którym należy sprawdzić, czy wybrany zasób klienta ma to samo konto wymienione w zamówieniu pracy. Pobieranie konta w zamówieniu pracy i zasobie klienta są procesami asynchronicznymi i musisz wykonać oba te czynności przed zweryfikowaniem.
W tym scenariuszu, ponieważ istnieje wiele procesów asynchronicznych i oba wywołania zwracają jedną obietnicę, zawijaj obie w metodę Promise.all() .
Uwaga / Notatka
Metodę preventDefault można używać tylko synchronicznie.
Przykład:
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"));
});
}
Włączanie asynchronicznych procedur obsługi OnSave przy użyciu ustawienia aplikacji
Aby użyć asynchronicznych procedur obsługi w usłudzeZapisz, włącz tę funkcję za pomocą ustawienia aplikacji:
Przejdź do https://make.powerapps.com.
Upewnij się, że wybrano odpowiednie środowisko.
W lewym okienku nawigacji wybierz pozycję Aplikacje.
Wybierz aplikację, wybierz pozycję ... (wielokropek), a następnie wybierz pozycję Edytuj.
Wybierz pozycję Ustawienia na pasku poleceń.
Po otwarciu okna dialogowego wybierz pozycję Funkcje.
Włącz program obsługi Async onSave.
Wybierz Zapisz.
Wyłączanie asynchronicznych limitów czasu programu obsługi onSave
Gdy używasz programu obsługi asynchronicznego OnSave , formularz czeka na spełnienie obietnicy zwróconej przez program obsługi. Aby upewnić się, że zapisywanie formularza zostało ukończone w odpowiednim czasie, program obsługi zgłasza wyjątek przekroczenia limitu czasu po 10 sekundach, aby poinformować Cię o dostrojeniu programu obsługi asynchronicznego OnSave w celu uzyskania lepszej wydajności.
Istnieją scenariusze, w których wymagana jest wstrzymanie OnSave programu obsługi przez dłużej niż 10 sekund. Przykładem jest otwarcie okna dialogowego i oczekiwanie na wprowadzenie danych wejściowych użytkownika przed kontynuowaniem zapisywania. Aby upewnić się, że operacja asynchroniowa czeka na rozwiązanie obietnicy, użyj metody disableAsyncTimeout .
Uwaga / Notatka
Przed instrukcjami await lub wywołaniami asynchronicznych należy wywołać metodę disableAsyncTimeout .
Przykład:
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?" });
}
Po wywołaniu polecenia disableAsyncTimeout limit czasu dla tej procedury obsługi nie jest stosowany. Nadal czeka na spełnienie obietnicy tego programu obsługi.
Ten wzorzec może mieć wpływ na wydajność zapisywania formularza.
Powiązane artykuły
Zdarzenie Grid OnSave
Zdarzenia (dokumentacja interfejsu API klienta)
Zdarzenia w formularzach i siatkach w aplikacjach opartych na modelu