writer.setAttribute 不触发 view downcast

writer.setAttribute don't trigger a view downcast

我有一个插件可以执行此操作:

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' } ))

据我所知,您只为元素定义了向下转型。您还需要为属性定义向下转换。如果元素的属性已更改,则不会重建该元素。

这是一个 link 文档页面,其中列出并解释了所有转换器助手:https://ckeditor.com/docs/ckeditor5/latest/api/module_engine_conversion_downcast-converters.html


更多解释在这里:

我承认命名可能有点混乱,人们可能会认为在指定 elementToElement 转换后,只要元素发生变化,它就会使用 elementToElement 转换器重建。

不过,其实有3种变化让人垂头丧气:

  • 插入,
  • 删除,
  • 属性更改(每当我写更改时,我的意思是更改、设置和删除属性)。

(还有添加标记、删除标记和选择更改,但这些对本主题不重要。)

因此,当完成一系列模型更改并开始向下转换时,引擎会检查发生了什么更改:

  • insertions - 如果插入了一个新元素,elementToElement 使用向下转换,
  • 删除 - 这些通常很容易并且由默认转换器处理 - 在大多数情况下你不需要提供自己的转换器(但是有些功能需要,比如列表插件),
  • 最后是属性更改 - 如果现有节点上的属性发生更改,则会触发属性向下转换以处理该更改。

如您所见,插入和属性更改是分开处理的。

但是,当插入带有属性的新元素时,插入更改和属性更改(对于新元素)都会被触发。

因此,通常,在一个转换器 (elementToElement) 中处理元素插入并在另一个转换器 (attributeToAttribute) 中处理属性更改是个好主意。特别是如果元素可以在有或没有该属性的情况下存在。在这种情况下,您可以将属性转换逻辑与元素转换逻辑分开。