Изменить модель ckeditor после события клика - PullRequest
0 голосов
/ 07 апреля 2020

в моем плагине ckeditor5 я слушаю событие click в документе. Мой плагин является виджетом, поэтому modelElement правильно получен.

    editor.listenTo( editor.editing.view.document, 'click', (evt, data) => {
        const modelElement = editor.editing.mapper.toModelElement( data.target);
           ....
        }

Теперь я думал «модифицировать» модель, добавив или удалив атрибут, который должен отображать другой пользовательский интерфейс. В основном, используя как-то следующий код.

            model.change( writer => {
                if (modelElement.hasAttribute('selected')){
                    writer.removeAttribute('selected');
                }
                else {
                    writer.setAttribute('selected', 'true');
                }
            }); 

Проблема в том, что у меня теперь есть Элемент , а событие change находится на Модельном объекте .

Есть ли какой-нибудь способ получить соответствующий объект Model, или я двигаюсь совершенно в неверном направлении с моей идеей?

* Обновление * Я получил немного дальше мое расследование Я объявил свой виджет как недоступный для редактирования.

return toWidget( widgetElement, viewWriter); // instead of towidgetEditable

Теперь я могу «найти» свой виджет в FirstRange из selection.

const selection = this.editor.model.document.selection;
const range = selection.getFirstRange();
for(const item of range.getItems()) {
    console.log(item.name); // -> item == my widget that I clicked on
}

Это прекрасно, так как я не собираюсь обновлять контент в любом случае. Тем не менее, он не дает мне элемент в качестве выбранного элемента

var element = selection.getSelectedElement();

Поэтому установка атрибута выбранного элемента также не работает.

            if(selection.hasAttribute('selected')){
                writer.removeSelectionAttribute('selected');
            }
            else{
                writer.setSelectionAttribute('selected', true);
            }
...