我有一个插件可以执行此操作:
model.change(writer => {
writer.setAttribute("testAtr","testValue",element);
});
那行得通。如果我漂亮地打印我的模型,我可以看到 testAtr。
但问题是,当我调用 writer.setAttribute 时,我的 mtHeaderLine 元素没有向下转换,所以当我的模型发生变化时,该变化在 gui 中是较新可见的。
我的沮丧被注册为 editor.conversion.for('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' } ))
最佳答案
据我所知,您只为元素定义了向下转型。您还需要为属性定义向下转换。如果元素的属性已更改,则不会重建该元素。
这是文档页面的链接,其中列出并解释了所有转换器助手:https://ckeditor.com/docs/ckeditor5/latest/api/module_engine_conversion_downcast-converters.html
更多解释在这里:
我承认命名可能有点困惑,人们可能会认为在指定 elementToElement
转换后,每当元素发生变化时,它都会使用 elementToElement
转换器重建。
然而,实际上有三种类型的变化是向下的:
- 插入,
- 删除,
- 属性更改(每当我写更改时,我的意思是更改、设置和删除属性)。
(还有添加标记、删除标记和选择更改,但这些对于本主题并不重要。)
因此,当完成一系列模型更改并开始向下转换时,引擎会检查更改的内容:
- insertions - 如果插入了新元素,则使用
elementToElement
向下转换, - 删除 - 这些通常很容易,由默认转换器处理 - 在大多数情况下你不需要提供自己的转换器(但有些功能需要,如列表插件),
- 最后是属性更改 - 如果现有节点上的属性发生更改,则会触发属性向下转换以处理该更改。
如您所见,插入和属性更改是分开处理的。
但是,当插入一个带有属性的新元素时,插入更改和属性更改(对于新元素)都会被触发。
因此,通常,在一个转换器 (elementToElement
) 中处理元素插入并在另一个转换器 (attributeToAttribute
) 中处理属性更改是一个好主意。特别是如果元素可以在有或没有该属性的情况下存在。在这种情况下,您可以将属性转换逻辑与元素转换逻辑分开。
关于javascript - writer.setAttribute 不会触发 View 向下转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52370477/