Мы пытаемся встроить отслеживание изменений в Quill, что включает проверку пользовательского ввода, а затем изменение документа.Например, если пользователь удаляет некоторый текст, мы отменяем удаление, а затем применяем атрибут track-deletion
.Вот упрощенный пример того, что мы делаем:
quill.on('text-change', (delta, oldContents, source) => {
if (source !== 'user') return;
const trackChangesDelta = delta.invert(oldContents);
trackChangesDelta.ops.forEach((op) => {
if (op.insert) op.attributes['track-deletion'] = true;
// Also handle tracked insertions, etc...
});
quill.updateContents(trackChangesDelta);
});
Этот подход в основном работает, но встречается в некоторых несколько странных случаях:
Если у меня есть текст foo
, и я выделяю текст, а затем набираю букву o
, я ожидаю, что будет удалено все слово, а затем вставка o
.Вместо этого пергамент, по-видимому, «оптимизирует» операционную систему и вместо этого делает пару удалений по обе стороны от середины o
Если я выделю и заменю текст в начале абзаца, затем вставленная буква идет в конец удаления, но мой курсор остается в неправильном месте
Я думаю обе эти проблемы являются признаками фактачто мы выполняем text-change
в пределах text-change
, и мне было интересно, есть ли лучший (более синхронный?) способ подключения к жизненному циклу документа Quill.
Например,Вторая проблема, которую мы имеем, решается с помощью setTimeout
, чтобы позволить документу Quill завершить обработку text-change
до того, как мы применяем наши изменения дорожки, но это приводит к некоторому другому нервному поведению.
В идеале, я 'Я хотел бы поймать text-change
еще до того, как он был применен к документу, но, насколько я могу судить, ни Перо, ни Пергамент не предлагают подходящего крючка?