Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 OnSave dla terminów, terminów cyklicznych lub rekordów działań usługi anuluje operację zapisywania i użyje komunikatu Book , aby utrwały zmianę, a nie Create lub Update. Z tego OnSavePostSave powodu programy obsługi zdarzeń dla tych tabel nie będą działać.
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ładowy scenariusz użycia asynchronicznych programów obsługi OnSave
Rozważ utworzenie zadania usługi zamówienia pracy. 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 jest zarówno procesami asynchronicznymi, jak i należy je ukończyć przed rozpoczęciem walidacji.
W tym scenariuszu, ponieważ istnieje wiele procesów asynchronicznych i oba wywołania zwracają jedną obietnicę, opakowując obie metody.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 asynchronicznego zapisywania przy użyciu ustawienia aplikacji
Aby użyć asynchronicznych procedur obsługi w usłudzeZapisz, należy włączyć ją za pomocą ustawienia aplikacji:
Przejdź do https://make.powerapps.com.
Upewnij się, że wybrano prawidłowe środowisko.
W lewym okienku nawigacji wybierz pozycję Aplikacje.
Wybierz aplikację, a następnie wybierz pozycję ... (wielokropek). Wybierz Edytuj.
Wybierz pozycję Ustawienia na pasku poleceń.
Po otwarciu okna dialogowego wybierz pozycję Funkcje.
Włącz program obsługi Async onSave.
Wybierz Zapisz.
)
Asynchroniczne limity czasu w usłudze 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 zostanie ukończone w odpowiednim czasie, program obsługi zgłosi wyjątek przekroczenia limitu czasu po 10 sekundach, aby poinformować Cię o dostrojeniu procedury 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 asynchroniczny 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 opcji disableAsyncTimeout limit czasu dla tej procedury obsługi nie jest stosowany. Nadal czeka na spełnienie obietnicy tego programu obsługi.
Ten wzorzec powinien być używany z ostrożnością, ponieważ może to 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