如何避免使用editor.getSession()。insert(...)来触发更改事件?

时间:2017-05-15 12:49:32

标签: javascript ace-editor

[最初的标题是:在Ace编辑器中阻止键盘操作,但抓住它们]

我使用Ace Editor来创建一个实时协作平台。我发现的问题或多或少与我的herethere相似,但它们都不适合我的情况。

如果有多个用户在写作,则会发生此事件:

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 change事件,该事件将信息发送回网络。这将创建一个无限循环。

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

1 个答案:

答案 0 :(得分:0)

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

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