是否可以在model.document.on('change')中停止删除操作?
我听这段代码的变化:
model.document.on('change',(eventInfo,batch) => {
// My code here.
}
据我所知,它可以正常工作并检查所有更改。但是似乎没有任何方法可以拒绝更改。
我试图在不同的地方调用eventInfo.stop()和reset()。这两种方法都不会停止更改,但是以后总是会导致 model-nodelist-offset-out-of-bounds: 如果我尝试停止删除操作,则会发生异常。
我想做的是更改文本删除的工作方式,因此,当用户删除文本时,我创建了一个标记来标记用户已“删除”了哪些文本,而不是从编辑器中真正删除文本。 。 (用于可选的更改控制)。
答案 0 :(得分:4)
代替停止更改,也许您可以在更改后保存数据值,并在出现以下情况时将重置为上一个值。删除发生:
var oldData = '';
var editor = ClassicEditor
.create(document.querySelector('#editor'))
.then(editor => {
editor.model.document.on('change',(eventInfo, batch) => {
if(oldData.length > editor.getData().length) {
// or use eventInfo.source.differ.getChanges() and check for type: "remove"
editor.setData(oldData);
}
oldData = editor.getData();
});
})
.catch( error => {
console.error( error );
});
请注意,您无需检查数据长度,而可以使用eventInfo.source.differ.getChanges()
遍历发生的更改,并检查是否存在“删除”类型的更改。
答案 1 :(得分:3)
已应用的操作(应用操作后会触发change
事件)不能被静默删除。需要对其进行还原(通过应用新操作将模型的状态还原为先前状态),或者在实际应用它们之前将其阻止。
最明显但性能极差的解决方案是使用setData()
。但是,这将重置选择并可能导致其他问题。
一种更好的解决方案是对要还原的每个应用操作应用反向操作。就像在git中一样思考–您无法删除提交(可以,但是可以强制执行,因此不必这样做)。相反,您可以应用反向提交。
CKEditor 5的操作允许getting their reversed conterparts。然后,您可以应用这些。但是,这样做之后,您需要确保模型的状态正确–这很棘手,因为在如此低的级别上工作时,您会丢失模型编写器中实现的规范化逻辑。
此解决方案的另一个缺点是,您将得到空的撤消步骤。撤消步骤由批次定义。如果您要添加一个批处理操作来还原已经在其中的操作,那么该批处理将是一个空的撤消步骤。目前,我不知道有什么机制可以将其从历史记录中删除。
因此,虽然还原操作是可行的,但它很棘手,目前可能无法正常工作。
这是我建议的解决方案。确保没有改变任何模型,而不是修复已经改变的模型。
CKEditor 5功能以commands的形式实现。命令的状态为isEnabled
。如果命令被禁用,则无法执行。
在CKEditor 5中,甚至还以命令(input
,delete
和forwardDelete
)的形式实现了诸如支持键入的功能。因此,可以通过禁用这些命令来防止键入。