Создание фокуса внутри CK Editor 5 createUIElement

Итак, у меня есть настраиваемый виджет, который отображает настраиваемый компонент.

conversion.for('editingDowncast').elementToElement({
    model: 'modelName',
    view: (modelElement, viewWriter) => {
      const modelName = modelElement.getAttribute('modelName');
      const modelNameView = viewWriter.createContainerElement('span', {
        class: 'modelName',
        'data-modelName': modelName,
      });

      const reactWrapper = viewWriter.createUIElement(
        'span',
        {
          class: 'modelName__react-wrapper',
        },
        function (this, domDocument) {
          const domElement = this.toDomElement(domDocument);

          rendermodelName(modelName, domElement);

          return domElement;
        },
      );

      viewWriter.insert(
        viewWriter.createPositionAt(modelNameView, 0),
        reactWrapper,
      );

      return toWidgetEditable(modelNameView, viewWriter);
    },
  });

Где rendermodelName вернет компонент React с простым полем ввода как

return (
    <div>
      <input type="text" />
    </div>
  );

https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/frameworks/react.html.

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

Стоит ли мне использовать новый createRawElement? Мой текущий CK5 - 20.0.0, поэтому я не хочу, чтобы сейчас происходили какие-либо критические изменения.

РЕДАКТИРОВАТЬ: Я изучил немного больше. похоже, что createRawElement здесь может не работать. Я думаю, у этого нет простого решения. Я пробовал с allowContentOf: '$block', который тоже не давал мне сосредоточиться. Но эти значения явно предназначены для обычного виджета CK, а не для компонента реакции.


person Asim K T    schedule 15.09.2020    source источник


Ответы (1)


Я столкнулся с аналогичной проблемой.

CKEditor будет принимать все события компонента React, который вы разместили в Widget.

Решение состоит в том, чтобы остановить распространение событий в CKEditor, которые запускаются из вашего элемента DOM (domElement), где размещен ваш компонент React.

Вот пример кода: https://github.com/ckeditor/ckeditor5-core/compare/proto/input-widget#diff-44ca1561ce575490eac0d660407d5144R239

Вы должны остановить все необходимые события. Также вы не можете вставлять какой-либо контент в поле ввода компонента React. Это также будет прослушиваться clipboardInput событием CKEditor.

person Sitaramireddy    schedule 24.09.2020
comment
Это работает. Думаю, мне тоже стоит поймать clipboardInput. - person Asim K T; 25.09.2020
comment
Наградой за этот ответ. Не ожидаю большего ответа на то же самое, так как прошло уже 10 дней. - person Asim K T; 25.09.2020
comment
Click не работает с этим методом. Сообщите мне, если кто-нибудь найдет решение, чтобы щелкнуть мышью - person Asim K T; 03.10.2020