在change()中停止操作

时间:2018-11-30 02:11:10

标签: ckeditor5

是否可以在model.document.on('change')中停止删除操作?

我听这段代码的变化:

model.document.on('change',(eventInfo,batch) => {
// My code here.
}

据我所知,它可以正常工作并检查所有更改。但是似乎没有任何方法可以拒绝更改。

我试图在不同的地方调用eventInfo.stop()和reset()。这两种方法都不会停止更改,但是以后总是会导致 model-nodelist-offset-out-of-bounds:  如果我尝试停止删除操作,则会发生异常。

我想做的是更改文本删除的工作方式,因此,当用户删除文本时,我创建了一个标记来标记用户已“删除”了哪些文本,而不是从编辑器中真正删除文本。 。 (用于可选的更改控制)。

2 个答案:

答案 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中,甚至还以命令(inputdeleteforwardDelete)的形式实现了诸如支持键入的功能。因此,可以通过禁用这些命令来防止键入。