Closed tormozit closed 3 years ago
Почему ты сразу не передаешь правильный текст, который надо вставить, ведь контекст, я так понимаю, тебе полностью известен?
Я передаю сразу правильный текст и он вставляется. Но потом редактор его стирает и пишет выбранное слово из списка автодополнения.
Я передаю сразу правильный текст и он вставляется. Но потом редактор его стирает и пишет выбранное слово из списка автодополнения.
Я не про тот текст, который ты вставляешь при возникновении события EVENT_ON_SELECT_SUGGEST_ROW
. Почему ты не передаешь правильный текст для вставки в showCustomSuggestions
, чтобы редактор сам вставил сразу то, что нужно?
Потому что мне нужно смещать каретку после вставки (например вставить "()" и сместить каретку в позицию между ними), т.е. нужно не просто вставлять текст, но и проводить более сложные операции. Причем этот механизм поддерживает не только твой редактор, но и стандартный с моим списком автодополнения. Поэтому хотелось бы из списка автодополнения получать именно чистое слово, чтобы не переделывать сразу много связанных сценариев работы.
Потому что мне нужно смещать каретку после вставки, т.е. нужно не просто вставлять текст, но и проводить более сложные операции.
Смещение каретки будет попроще вставки текста, как мне кажется
Также анализ "Нужно ли добавлять скобки и сколько скобок и нужно ли смещать каретку и т.д." также требует вычислений, зависящих от типа каждого слова. Делать это перед отображением списка - неоправданное ожидание для пользователя. Ведь он может и не воспользоваться списком автодополнения.
Также анализ "Нужно ли добавлять скобки и сколько скобок и нужно ли смещать каретку и т.д." также требует вычислений, зависящих от типа каждого слова.
Я так понимаю, ты всё равно так или иначе делаешь эти вычисления, чтобы указать поле kind
для передачи в showCustomSuggestions
Если всё оставить, как есть, то единственное, что пока приходит на ум - это формировать событие EVENT_ON_SELECT_SUGGEST_ROW
с некоторой задержкой, чтобы редактор успел вставить текст, до того, как ты будешь что-то менять из 1С
Еще можно передавать пустое поле text
, тогда вставки вообще не будет.
можно передавать пустое поле
text
, тогда вставки вообще не будет.
В моем случае это допустимо, т.к. я всегда вставляю выбранное слово сам. Убрал заполнение атрибута text при подготовке данных списка автодополнения. Проблема ушла.
Однако в редакторе для случая стандартной обработки выбора элемента списка автодополнения она осталась.
Нет в редакторе такой проблемы, или мы говорим о разном. Редактор вставляет ровно то, что ему передано для вставки, ничего он при этом не стирает. Тут проблема асинхронного взаимодействия т.к. нет возможности из 1С прервать вставку. Событие EVENT_ON_SELECT_SUGGEST_ROW прилетает в 1С, ты вставляешь свой текст, но сразу после этого отрабатывает родное событие вставки выбранного значения. Видимо, оно происходит с некоторой задержкой, и ты в этот момент успеваешь вставить текст.
Нет в редакторе такой проблемы
Согласен. Я некорректно указал, что проблема осталась "для случая стандартной обработки". Она осталась только для случая собственной вставки и заполненного атрибута text у слов списка автодполнения. А совместное использование этих операций, как ты справедливо заметил, избыточно.
Я согласен, было бы классно при получении события подавлять сразу родную обработку, что-то вроде preventDefault()
, но к сожалению, такой возможности нет.
В общем резюмирую для остальных читателей. Нужно либо не заполнять атрибут text в собственных элементах списка автодополнения, либо не вставлять выбранное слово в событии EVENT_ON_SELECT_SUGGEST_ROW. А при выполнении собственной вставки для родного элемента списка проблема остается, но такое маловероятно что понадобится кому то.
Допустим каретка стоит перед скобкой и я вызываю список автодополнения. В нем я кликом выбираю элемент.
При этом вызывается событие EVENT_ON_SELECT_SUGGEST_ROW и выполняется мой обработчик:
Он вставляет правильный текст (это становится понятно после нажатия CTRL+Z). Но сразу после этого редактор затирает его вставку и все окончание строки - даже тот текст, который был до этого (на картинке ";").
Вероятность что это делает мой код - очень мала, т.к. все вставки у меня идут через одно место в коде.