Оповещение дочерних контролов о действиях на форме

В диалоге редактирования записи могут присутствовать дочерние контролы, для которых перед сохранением или закрытием диалога редактирования необходимо выполнить определенные действия.

Например, для списка с запущенным редактированием по месту произойдет следующее:

  • при сохранении диалога сначала сохранится редактируемая запись в дочернем контроле, а потом и форма диалога редактирования.
  • при закрытии диалога сначала завершится редактирование по месту без сохранения, а потом закроется диалог.

При использовании редактирования по месту дополнительная настройка не требуется. Описанный ниже алгоритм следует применять в ситуациях, когда необходимо добиться аналогичного поведения для прикладных контролов.

Чтобы дочерние контролы могли отреагировать на начало сохранения либо уничтожения контрола, им необходимо зарегистрировать соответствующие обработчики.

Обработчики регистрируются через событие registerFormOperation, в аргументах которого ожидается объект с полями:

  • save:Function — вызов происходит перед началом сохранения.
  • cancel:Function — вызов происходит перед показом вопроса о сохранении.
  • isDestroyed:Function — функция сообщает о том, не разрушился ли контрол, зарегистрировавший операцию. Если он будет разрушен, операция автоматически удалится из списка зарегистрированных.
// TypeScript
this._notify('registerFormOperation', [{
     
    // Сохраняем данные перед сохранением формы.
    save: () => this._commitEdit(),
    cancel: () => this._cancelEdit(this),
    isDestroyed: () => self._destroyed
}], { bubbling: true });

Методы save и cancel — поддерживают асинхронные результаты работы т. е. из них можно вернуть Promise — выполнение команды (сохранить/отменить) будет отложено пока Promise не разрешится.