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
) 中处理属性更改是个好主意。特别是如果元素可以在有或没有该属性的情况下存在。在这种情况下,您可以将属性转换逻辑与元素转换逻辑分开。
我有一个插件可以执行此操作:
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
) 中处理属性更改是个好主意。特别是如果元素可以在有或没有该属性的情况下存在。在这种情况下,您可以将属性转换逻辑与元素转换逻辑分开。