我有一个执行此操作的插件
model.change(writer => {
writer.setAttribute("testAtr","testValue",element);
});
那行得通。如果我漂亮地打印了模型,则可以看到testAtr。
但是问题是,当我调用writer.setAttribute时,我的mtHeaderLine元素并未向下转换,因此当我的模型发生更改时,该更改在gui中会更新。
我的下注已注册为editor.conversion.for('downcast') 当元素第一次添加到模型中时,就会调用downcast。
不知道这有什么关系,但是我的插件已注册为
model.schema.register(mtHeaderLine, {
inheritAllFrom: '$block',
allowAttributes: ['testatr']
});
所以我期望writer.setAttribute导致新的失败是我错了吗?如果是的话,我应该如何更改自定义元素的属性,以使它们导致对gui的更改?
下调代码是
editor.conversion.for('dataDowncast').add(downcastElementToElement( { model: mtHeaderLine,
view: ( modelElement, viewWriter ) => {
const css=modelElement.getAttribute('css');
const isGhost=modelElement.getAttribute("isghost");
console.log("dataDowncast::Doing line downcast. css='" + css + "' isGhost=" + isGhost);
const viewElement=viewWriter.createEditableElement('div',{ 'class': (mtHeaderLine + " " + css) ,isghost: isGhost });
// return toWidgetEditable(viewElement,viewWriter );
return viewElement;
}
}));
感谢您的帮助。我现在开始工作了。我要做的就是添加行
.add(downcastAttributeToAttribute( { model: 'isghost', view: 'isghost' } ))
答案 0 :(得分:1)
据我所知,您仅定义了元素的向下转换。您还需要为属性定义向下转换。如果元素的属性已更改,则不会重建。
这是指向文档页面的链接,其中列出并说明了所有转换器帮助器:https://ckeditor.com/docs/ckeditor5/latest/api/module_engine_conversion_downcast-converters.html
更多说明在这里:
我承认命名可能会有些混乱,并且可能会认为在指定elementToElement
转换后,只要元素发生更改,都将使用elementToElement
转换器对其进行重建。
但是,实际上存在三种类型的变更:
(也有添加标记,删除标记和选择更改,但这对这个主题而言并不重要。)
因此,当完成了一系列模型更改并且开始进行向下转换时,引擎将检查已更改的内容:
elementToElement
下注,如您所见,插入和属性更改是分开处理的。
但是,当插入带有属性的新元素时,将触发插入更改和属性更改(对于新元素)。
因此,通常最好在一个转换器(elementToElement
)中处理元素插入,而在另一个转换器(attributeToAttribute
)中处理属性更改。特别是如果元素可以同时存在或不存在该属性。在这种情况下,可以将属性转换逻辑与元素转换逻辑分开。