Операция, которая уже была применена (и событие change
запускается после применения операций), не может быть удалена без вывода сообщений.Их необходимо либо отменить (применив новые операции, которые вернут состояние модели к предыдущей), либо предотвратить до того, как они действительно будут применены.
Отмена операций
Наиболее очевидные, ноКрайне неэффективным решением является использование setData()
.Это, однако, сбросит выбор и может вызвать другие проблемы.
Гораздо более оптимальным решением является применение обратных операций для каждой примененной операции, которую вы хотите отменить.Подумайте, как в git - вы не можете удалить коммит (хорошо, вы можете, но вам придется делать принудительный толчок, поэтому вы этого не сделаете).Вместо этого вы применяете обратную фиксацию.
Операции CKEditor 5 позволяют получать их обратную версию .Вы можете применить их.Однако вам нужно убедиться, что состояние модели правильное после того, как вы это сделаете - это сложно, поскольку при работе на таком низком уровне вы теряете логику нормализации, которая реализована в модуле записи модели.
Другим недостатком этого решения является то, что вы в конечном итоге получите пустые шаги отмены.Шаги отмены определяются партиями.Если вы добавите к пакетным операциям, которые возвращают те, которые уже находятся в нем, этот пакет будет пустым шагом отмены.В настоящее время я не знаю механизма, который позволил бы удалить его из истории.
Поэтому, хотя возврат операций возможен, он сложен и может не работать безупречно в данный момент.
Предотвращение применения операций
Это решение, которое я бы рекомендовал.Вместо того, чтобы исправлять уже измененную модель, убедитесь, что она вообще не меняется.
Функции CKEditor 5 реализованы в виде команд .Команды имеют состояние isEnabled
.Если команда отключена, она не может быть выполнена.
В CKEditor 5 даже такие функции, как поддержка ввода, реализованы в форме команд (input
, delete
и forwardDelete
).Следовательно, предотвращение ввода может быть достигнуто путем отключения этих команд.