如何避免 editor.getSession().insert(...) 触发 change 事件?

How to avoid editor.getSession().insert(...) to trigger a change event?

[最初的标题是:在 Ace Editor 中防止键盘操作但捕获它们]

我使用 Ace Editor 来创建一个实时协作平台。我发现问题与我的 here or there 或多或少相似,但其中 none 适合我的情况。

如果有多个用户写入,则此事件会导致问题:

editor.getSession().on('change', function(e) {
    // action = e.action
    // newString = e.lines
    // index = editor.session.doc.positionToIndex(editor.selection.getCursor())
}

当用户想要输入某些内容(按键事件)时,我想捕捉动作、添加或删除的内容以及光标的索引(不是(row, col))。插入或删除应该在这一步被阻止。这三个参数应该是函数sendDelta(action, string, index).

的输入

为了简化,函数sendDelta(action, string, index)应该调用负责插入的insertDelta(action, string, index)。但是这个插入应该不会唤醒内容变化的事件。

总而言之,我只想捕获来自键盘的内容,而不是通过函数 insertDelta(action, string, index) 完成的插入。

编辑

正如@a_user 所建议的,我认为我的应用程序的设计没有意义。所以我想问一个非常接近第一个的问题。

假设我有一个函数 changeFromServer(action, string, index),它从网络接收信息并应用更改。然后插入将触发 on change 事件,该事件将信息发送回网络。这将创建一个无限循环。

我不确定我的解释是否清楚。如果不是,this user 和我有同样的问题,他的描述看起来比我的好。顺便说一句,我不明白那里提供的答案。

使用标志来了解何时从 changeFromServer 调用更改事件

var fromServer = false
function changeFromServer() {
    fromServer = true
    // call applyDelta here
    fromServer = false
}
doc.on("change", function(e) { 
    if (fromServer) return;
})