Остановить операцию в смене () - PullRequest
0 голосов
/ 30 ноября 2018

Есть ли способ остановить операцию удаления в model.document.on ('change')?

Я слушаю изменения с этим кодом:

model.document.on('change',(eventInfo,batch) => {
// My code here.
}

И это работаетхорошо, насколько я понимаю и могу проверить все изменения.Но, похоже, нет никакого способа отклонить изменение.

Я попытался вызвать eventInfo.stop () и reset () для дифференциала.Оба эти метода останавливают изменение, но всегда позже приводят к исключению model-nodelist-offset-out-of-bounds: , если я пытаюсь остановить операцию удаления.

ЧтоЯ пытаюсь сделать, чтобы изменить, как работает удаление текста, поэтому, когда пользователь удаляет текст, вместо того, чтобы действительно удалить текст из редактора, я создаю маркер, который отмечает, какой текст был «удален» пользователем.(Для дополнительного контроля изменений).

Ответы [ 2 ]

0 голосов
/ 04 января 2019

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

Отмена операций

Наиболее очевидные, ноКрайне неэффективным решением является использование setData().Это, однако, сбросит выбор и может вызвать другие проблемы.

Гораздо более оптимальным решением является применение обратных операций для каждой примененной операции, которую вы хотите отменить.Подумайте, как в git - вы не можете удалить коммит (хорошо, вы можете, но вам придется делать принудительный толчок, поэтому вы этого не сделаете).Вместо этого вы применяете обратную фиксацию.

Операции CKEditor 5 позволяют получать их обратную версию .Вы можете применить их.Однако вам нужно убедиться, что состояние модели правильное после того, как вы это сделаете - это сложно, поскольку при работе на таком низком уровне вы теряете логику нормализации, которая реализована в модуле записи модели.

Другим недостатком этого решения является то, что вы в конечном итоге получите пустые шаги отмены.Шаги отмены определяются партиями.Если вы добавите к пакетным операциям, которые возвращают те, которые уже находятся в нем, этот пакет будет пустым шагом отмены.В настоящее время я не знаю механизма, который позволил бы удалить его из истории.

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

Предотвращение применения операций

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

Функции CKEditor 5 реализованы в виде команд .Команды имеют состояние isEnabled.Если команда отключена, она не может быть выполнена.

В CKEditor 5 даже такие функции, как поддержка ввода, реализованы в форме команд (input, delete и forwardDelete).Следовательно, предотвращение ввода может быть достигнуто путем отключения этих команд.

0 голосов
/ 08 декабря 2018

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

var oldData = '';
var editor = ClassicEditor
    .create(document.querySelector('#editor'))
    .then(editor => {
        editor.model.document.on('change',(eventInfo, batch) => {
           if(oldData.length > editor.getData().length) {
           // or use eventInfo.source.differ.getChanges() and check for type: "remove"
                editor.setData(oldData);
            }
            oldData = editor.getData();
        });
    })
    .catch( error => {
        console.error( error );
    });

Обратите внимание, что вместо проверки длины данных , вы можете циклически просматривать изменения, произошедшие с помощью eventInfo.source.differ.getChanges(), и проверять, были ли изменения типа «удалить».

...