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