在 change() 中停止操作
Stop operation in change()
有没有办法停止 model.document.on('change') 中的删除操作?
我用这段代码听变化:
model.document.on('change',(eventInfo,batch) => {
// My code here.
}
而且它工作正常,就我确实得到并可以检查所有更改而言。但是似乎没有任何方法可以拒绝更改。
我试图在不同的地方调用 eventInfo.stop() 和 reset()。这两种方法都会停止更改,但稍后总是会导致 model-nodelist-offset-out-of-bounds:
如果我尝试停止删除操作,则会出现异常。
我想做的是改变文本删除的工作方式,所以当用户删除文本时,我并没有真正从编辑器中删除文本,而是创建了一个标记来标记哪些文本已被删除 "deleted" 由用户。 (对于可选的变更控制)。
而不是停止更改,也许您可以在更改后保存数据值并“重置”到以前的值 当删除发生时:
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()
发生的更改,并检查是否有 "remove" 类型的更改。
无法静默删除已经应用的操作(并且 change
事件在应用操作后触发)。它们需要被恢复(通过应用新的操作将模型的状态恢复到之前的状态)或者在它们实际被应用之前被阻止。
还原操作
最明显但性能极差的解决方案是使用 setData()
。但是,这将重置选择并可能导致其他问题。
一个更优的解决方案是对每个要还原的已应用操作应用反向操作。像 git 中那样思考——你不能删除提交(好吧,你可以,但你必须强制推送,所以你不需要)。相反,您应用反向提交。
CKEditor 5 的操作允许getting their reversed conterparts。然后你可以应用那些。然而,你需要确保模型的状态在你这样做之后是正确的——这很棘手,因为当在如此低的水平上工作时,你会失去在模型编写器中实现的规范化逻辑。
此解决方案的另一个缺点是您最终会得到空的撤消步骤。撤消步骤按批次定义。如果您将添加到一个批处理操作中以恢复其中已有的操作,则该批处理将是一个空的撤消步骤。目前,我不知道允许将其从历史记录中删除的机制。
因此,虽然恢复操作是可行的,但它很棘手,目前可能无法完美运行。
阻止应用操作
这是我推荐的解决方案。不要修复已经更改的模型,而是确保它根本没有更改。
CKEditor 5 功能以commands. Commands have their isEnabled
状态的形式实现。如果命令被禁用,则无法执行。
在 CKEditor 5 中,甚至支持键入等功能也以命令的形式实现(input
、delete
和 forwardDelete
)。因此,可以通过禁用这些命令来防止键入。
有没有办法停止 model.document.on('change') 中的删除操作?
我用这段代码听变化:
model.document.on('change',(eventInfo,batch) => {
// My code here.
}
而且它工作正常,就我确实得到并可以检查所有更改而言。但是似乎没有任何方法可以拒绝更改。
我试图在不同的地方调用 eventInfo.stop() 和 reset()。这两种方法都会停止更改,但稍后总是会导致 model-nodelist-offset-out-of-bounds: 如果我尝试停止删除操作,则会出现异常。
我想做的是改变文本删除的工作方式,所以当用户删除文本时,我并没有真正从编辑器中删除文本,而是创建了一个标记来标记哪些文本已被删除 "deleted" 由用户。 (对于可选的变更控制)。
而不是停止更改,也许您可以在更改后保存数据值并“重置”到以前的值 当删除发生时:
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()
发生的更改,并检查是否有 "remove" 类型的更改。
无法静默删除已经应用的操作(并且 change
事件在应用操作后触发)。它们需要被恢复(通过应用新的操作将模型的状态恢复到之前的状态)或者在它们实际被应用之前被阻止。
还原操作
最明显但性能极差的解决方案是使用 setData()
。但是,这将重置选择并可能导致其他问题。
一个更优的解决方案是对每个要还原的已应用操作应用反向操作。像 git 中那样思考——你不能删除提交(好吧,你可以,但你必须强制推送,所以你不需要)。相反,您应用反向提交。
CKEditor 5 的操作允许getting their reversed conterparts。然后你可以应用那些。然而,你需要确保模型的状态在你这样做之后是正确的——这很棘手,因为当在如此低的水平上工作时,你会失去在模型编写器中实现的规范化逻辑。
此解决方案的另一个缺点是您最终会得到空的撤消步骤。撤消步骤按批次定义。如果您将添加到一个批处理操作中以恢复其中已有的操作,则该批处理将是一个空的撤消步骤。目前,我不知道允许将其从历史记录中删除的机制。
因此,虽然恢复操作是可行的,但它很棘手,目前可能无法完美运行。
阻止应用操作
这是我推荐的解决方案。不要修复已经更改的模型,而是确保它根本没有更改。
CKEditor 5 功能以commands. Commands have their isEnabled
状态的形式实现。如果命令被禁用,则无法执行。
在 CKEditor 5 中,甚至支持键入等功能也以命令的形式实现(input
、delete
和 forwardDelete
)。因此,可以通过禁用这些命令来防止键入。