CKEditor5视图模型位置和范围转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CKEditor5视图模型位置和范围转换相关的知识,希望对你有一定的参考价值。

engine/conversion/mapper类实现了我需要的功能,但是,我有一些关于如何最有效地获取/构建这个对象的问题。

我希望将Mapper对象置于一种状态,同时可以同时实现两种方式(模型查看和查看模型)转换。

a)有没有办法从Mapper(例如一个事件)获得DataController

b)如果我必须建立自己的Mapper,那么最好的方法是什么?

我真的想避免修改DataController,但是,我更喜欢一种最有可能与未来CKEditor5版本向前兼容的解决方案。

更新(更多背景):基本上这个问题是在model方法中使用DataProcessor中的toData的后续行动。

我从手头的任务开始,然后在解释我正在尝试使用与原始问题更相关的位置。

所以,我需要将编辑器数据转换为BBCode(到目前为止一直很好),但我不知道html是什么(另一个插件将为bolditalic等设置架构)。因此,我想将模型用于某些转换,例如,即使事实上我必须自己将属性转换为标记,因此从模型转换文本节点似乎更容易。

然而,尽管在我的另一个问题上警告说它可能变得太复杂而且我会更好地转换,例如从DOM(我仍然不同意),我决定使它更复杂,并从视图和模型转换。现在,我们来到这个问题。

我做转换的计划如下:

a)将viewFragment转换为modelFragment。在这里,我想以两种方式在它们之间进行所有位置转换。

b)向下传递转换管道,其中有一些处理元素和文本节点的通用框架,带有一组可扩展的“转换规则”对象,以处理paragraphbold˛属性。

在b)中,每个“转换规则”可以决定从他们想要转换的内容(视图,模型,转换为视图到DOM或Markdown或其他),然后在文本中返回转换结果,模型位置指向下一个元素之前要处理,并在视图中的相同位置。

因此,例如,<p><b>text</b></p><p>...</p>是数据处理器在模型和视图以及文档片段中的第一个p之前获得位置的文本。当所有的魔法发生时,它将返回一个具有{result:'[b]text[/b] ', modelPos:'[par]...[/par]ˇ[par]...[/par]', viewPos: '<p><b>text</b></p>ˇ<p>...</p>'}的物体,其中ˇ将是适当的位置物体指向的位置。

我希望它有点清楚,我正在尝试做什么,它有点长,因为我试图描述问题,所以你可以更好地判断我的解决方案我试图应用它。

答案

不幸的是,你描述的问题非常复杂,可能过于宽泛而无法回答。这就是我保持答案简短的原因。

不幸的是,我没有看到在你的情况下使用DataControllers Mapper的简单而合理的方法。这意味着你需要以某种方式破解它。

此外,通常情况下,Mapper仅用于向下转换,所以只有当你做DataController#toView时。记在脑子里。在加载数据时,我们从未需要使用Mapper

我正在考虑最简单的破解方法,但说实话,我认为你必须修改DataController或者只是准备一些与DataController#toView类似的代码。创建自己的Mapper实例,不要在代码中清除绑定。

或者,您可以创建自己的MyMapperMyDataController类来扩展CKE5类。 MyDataController可以覆盖#mapper财产 - > this.mapper = new MyMapper()。而MyMapper可以在清除时发送某种事件。在该事件中,您可以复制映射器数据供您使用。

最后一个选项是在CKE5 Github上创建一个问题。我可以看到,在DataController#toView中,清算可以移动到方法的开头。应该没有这种变化的有害结果,映射器可以使用,直到下一次toView呼叫。如果您创建了该问题,我们可能会在内部讨论此更改并可能实现它。

以上是关于CKEditor5视图模型位置和范围转换的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在背面片段导航上再次设置视图模型

片段的视图模型

CKEditor 5如何从任何小部件/模型/视图中获取单击,更新和删除的事件

片段的视图模型而不是访问活动视图模型?

LiveData 没有观察具有共享视图模型的子视图页面片段

如何在片段转换中淡出非共享视图?