如何避免 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;
})
[最初的标题是:在 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;
})