в моем плагине 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);
}