Бележка
Достъпът до тази страница изисква удостоверяване. Можете да опитате да влезете или да промените директориите.
Достъпът до тази страница изисква удостоверяване. Можете да опитате да промените директориите.
Събитието OnSave възниква, когато:
- Потребителят избира бутона Запиши или Обнови в лентата с команди дори когато няма променени данни за записване.
- Кодът изпълнява метода formContext.data.entity.save дори когато няма променени данни за записване.
- Потребителят се отдалечава от формуляра и във формуляра има незаписани данни.
- Опцията за автоматично записване е разрешена, 30 секунди след промяна на данните и във формуляра има незаписани данни.
- Кодът изпълнява метода formContext.data.save и във формуляра има незаписани данни.
- Кодът изпълнява метода formContext.data.refresh , който предава стойност True като първи параметър, а във формуляра има незаписани данни.
Бележка
OnSave Събитието за записите за среща, повтаряща се среща или дейност по обслужването ще отмени операцията за записване и ще използва съобщениетоBook, за да запази промяната, а Create не .Update Поради това OnSave манипулаторите PostSave на събития за тези таблици няма да работят.
За да определите кой бутон е щракнат, за да извършите записването, използвайте метода getSaveMode .
Можете да отмените действието за записване, като използвате метода preventDefault в обекта на аргументите на събитието. Методът preventDefault е достъпен с помощта на метода getEventArgs, който е част от контекста на изпълнение. Контекстът за изпълнение автоматично се подава на манипулатора на събития на формуляра.
Поддръжка на асинхронен манипулатор на събития
Събитието OnSave има възможност да изчака обещанията, върнати от манипулаторите на събития, да се установят преди записването, което позволява събитието OnSave да бъде асинхронно ("асинхронно").
Събитието OnSave става асинхронно, когато манипулаторът на OnSave събитието върне обещание. Записването на записа се случва, когато всяко обещание, върнато от манипулатора, бъде разрешено. За всички върнати обещания има 10-секундно ограничение за всяко обещание, след което платформата счита, че времето за изчакване на платформата е изтечело. Това време на изчакване се прилага за всяко обещание. Ако например имаме върнати пет обещания, общото време за изчакване е 50 секунди.
Ако обещанието е отхвърлено или времето му на изчакване изтече, операцията за записване продължава да се държи по същия начин като текущите грешки в скрипта. Използвайте метода preventDefault в обекта на аргументите на събитието в този конкретен манипулатор, ако искате да предотвратите възникването на събитието за записване, ако има грешка в скрипта/отхвърлено обещание или прекъсване на манипулатора.
Можете също да отмените операцията за записване независимо от грешката в манипулатора или да не използвате метода preventDefault в обекта на аргументите на събитието. Ако този метод се нарича, събитието Async OnSave чака всички обещания да се уредят, но записването няма да се случи. Извикването на този метод означава, че логиката в рамките на .then() & .catch() ще се изпълни.
Събитието OnSave чака едно обещание, върнато на манипулатор. Ако са необходими няколко обещания, препоръчително е да огърлите всички обещания в метода Promise.all() и да върнете еднократното получено обещание. За множество манипулатори, които всички връщат обещание, ви препоръчваме да създадете един манипулатор, който да се обади на всички събития и да върне едно обещание, което пренася всички необходими обещания. Тази практика е да намалите времето на изчакване, причинено от времето на изчакване.
Примерен сценарий за това кога да се използват асинхронни манипулатори при записване
Помислете за създаване на задача за сервизна поръчка за работа– трябва да проверите дали избраният актив на клиента има същия акаунт, посочен в работната поръчка. Извличането на акаунта в "Работна поръчка" и "Актив на клиент" са както асинхронни процеси, така и трябва да бъдат завършени, преди да може да се извърши проверката.
В този случай, тъй като има множество асинхронни процеси и двете повиквания връщат едно обещание чрез обтичане и двете в метода Promise.all() .
Бележка
Методът preventDefault може да се използва само синхронно.
Например:
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"));
});
}
Разрешаване на асинхронно записване чрез настройката на приложението
За да използвате асинхронни манипулатори за записване, трябва да го разрешите чрез настройка на приложение:
Отидете на https://make.powerapps.com.
Уверете се, че сте избрали правилната среда.
В левия навигационен екран изберете Приложения.
Изберете приложението и след това изберете ... (многоточие). Изберете Редактиране.
Изберете Настройки от лентата с команди.
Когато се отвори диалоговият прозорец, изберете Функции.
Включете Async на Манипулатор за записване.
Изберете Запиши.
Времена на изчакване при асинхронно записване
Когато използвате асинхронен OnSave манипулатор, формулярът чака обещанието, върнато от манипулатора, да бъде изпълнено. За да се гарантира, че записването на формуляра ще завърши навреме, манипулаторът ще направи изключение с изтичане на времето на изчакване след 10 секунди, за да ви уведоми да настроите асинхронния OnSave манипулатор за по-добра производителност.
Има сценарии, при които е необходимо пауза на манипулатора OnSave за повече от 10 секунди. Пример за това е да отворите диалогов прозорец и да изчакате въвеждането от потребителя, преди да продължите да записвате. За да се уверите, че асинхронната операция чака обещанието да се разреши, използвайте метода disableAsyncTimeout .
Бележка
Трябва да се обадите disableAsyncTimeout преди изречения в очакване или асинхронни повиквания.
Например:
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?" });
}
Когато disableAsyncTimeout е извикано, времето на изчакване за този манипулатор не се прилага. Продължава да чака обещанието на този манипулатор да се изпълни.
Този модел трябва да се използва внимателно, тъй като може да повлияе на изпълнението на записването на формуляра.
Свързани статии
Събитие onSave на мрежата
Събития (справка за API на клиент)
Събития във формуляри и мрежи в приложения, управлявани от модел