Подія Form OnSave (довідник з API клієнта) у програмах на основі моделі

Подія 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 за допомогою параметра програми

Щоб використовувати обробники async onSave, потрібно ввімкнути його за допомогою параметра програми:

  1. Перейти до https://make.powerapps.com.

  2. Переконайтеся, що вибрано правильне середовище.

  3. У навігаційній панелі ліворуч виберіть Програми.

  4. Виберіть програму, а потім виберіть ... (три крапки). Виберіть Редагування.

  5. На панелі команд натисніть кнопку Настройки .

  6. Коли відкриється діалогове вікно, виберіть елемент Компоненти.

  7. Увімкніть Async onSave handler.

  8. Виберіть Зберегти.

    Async OnSave app setting

Час очікування Async OnSave

Коли ви використовуєте асинхронний 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 , час очікування для цього обробника не застосовується. Він продовжує чекати, поки обіцянка цього обробника буде виконана.

Цей шаблон слід використовувати з обережністю, оскільки це може вплинути на продуктивність збереження форми.

Сітка події під час збереження
Події (довідник із інтерфейсу API клієнта)
Події у формах і сітках у програмах на основі моделі