Как получить значение поля htmlEditor в клиентском скрипте виджета

Здравствуйте.

Есть виджет, в котором модальное окно содержащее поле htmlEditor. По кнопке “Сохранить” в модальном окне вызывается клиентская функция “s_widget_custom.editorModalSave”. При этом, если попытаться в этой функции получить значение поля, которое указано в model элемента htmlEditor - мы получаем пустоту.
Как все таки можно получить значение поля (тот HTML-код что мы получили в редакторе)?

Пример шаблона:

<modal
  title="Тест"
  isShow="{data.showEditorModal}"
  doClose="window.s_widget_custom.editorModalClose();"
>
<htmlEditor 
    label="КОД" 
    model="data.htmlData" 
    isMandatory="true"
></htmlEditor>
        <div class="modalCancelConfirmationButtons">
            <button buttonType="primary"
                event-click="s_widget_custom.editorModalSave()">
                Сохранить
            </button>
            <button buttonType="destructive" event-click="s_widget_custom.editorModalClose()">
                Отмена
            </button>
        </div
</modal>

Клиентский скрипт:

s_widget_custom.editorModalSave = async () => {
      const htmlData= s_widget.getFieldValue('htmlData');
      console.log('htmlData', htmlData);
}

Результат:

Я смог получить данные из тега htmlEditor только через dom.
При запуске этого тега в DOM появляется объект CKEDITOR и далее можно вытащить данные из него уже используя свойства этого бъекта. Ниже функция, которая делает нужное

s_widget_custom.editorModalSave = async () => {
      const htmlData = getHtml();
      console.log('htmlData', htmlData);
}

function getHtml() {
  if (typeof CKEDITOR == 'object') {
    let ckname = '';
    if (CKEDITOR.currentInstance) {
      ckname = CKEDITOR.currentInstance.name;
    } else {
    // альтернативный вариант если нет активных редакторов, то берем первый доступный
      const ckeditorInstancesNames = CKEDITOR.instances;
      const ckeditorInstance = Object.keys(ckeditorInstancesNames);
      ckname = ckeditorInstance[0];
    }
//    console.log(ckname);
    const body_html = CKEDITOR.instances[ckname].getData();
    return body_html;
  }  else {
    return '';
  }
}
2 лайка

Спасибо большое. Так работает и получаем полный html-код из поля htmlEditor. Теперь осталось придумать как сетить это поле)

Как раз установка значений через model работает. Если я правильно понял задачу.

s_widget.setFieldValue('htmlData');
1 лайк

Все верно - работает. Когда-то были темы, что не срабатывало setValue на форме для этого поля. Но в виджете все хорошо. Спасибо.