writer.setAttribute不会触发视图向下转换

时间:2018-09-17 14:52:57

标签: javascript ckeditor5

我有一个执行此操作的插件

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

1 个答案:

答案 0 :(得分:1)

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

这是指向文档页面的链接,其中列出并说明了所有转换器帮助器:https://ckeditor.com/docs/ckeditor5/latest/api/module_engine_conversion_downcast-converters.html


更多说明在这里:

我承认命名可能会有些混乱,并且可能会认为在指定elementToElement转换后,只要元素发生更改,都将使用elementToElement转换器对其进行重建。

但是,实际上存在三种类型的变更:

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

(也有添加标记,删除标记和选择更改,但这对这个主题而言并不重要。)

因此,当完成了一系列模型更改并且开始进行向下转换时,引擎将检查已更改的内容:

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

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

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

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