javascript - writer.setAttribute 不会触发 View 向下转换

标签 javascript ckeditor5

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

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/

相关文章:

javascript - 如何从全局范围中切断函数

javascript - 如何接收上传图片的 URL 并将其传递给 CK Editor 中的 "src"属性?

javascript - 托管更改后 Google Map Api V3 不显示

javascript - 我应该如何在 Matter.js 中使用 Matter.Object.create 放置对象?

javascript - Angular 1.5 UI 在用户进行另一个输入之前不会更新

javascript - 如何使用 jQuery Select2 插件删除与当前输入的文本匹配的下拉项?

ckeditor - 在 ckeditor5 下拉项上注册点击监听器

reactjs - React Js 中的 CKEditor 5 图片上传错误

ckeditor5 - Ckeditor 5 如何以编程方式触发复制、剪切、粘贴事件