2017-05-15 6 views
0

[초기 제목은 : Ace Editor에서 키보드로 작업하지 말고 catch하십시오]editor.getSession(). insert (...)를 사용하여 변경 이벤트를 트리거하는 것을 피하는 방법은 무엇입니까?

저는 실시간 협업 플랫폼을 만들기 위해 Ace Editor를 사용합니다. 질문에 대한 답변이 내 here 또는 there과 비슷하지만 그 중 어느 것도 내 경우에는 적합하지 않습니다.

쓰기 다수의 사용자가있는 경우 문제의 원인이 이벤트가 :

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) 인 경우를 가정 해 봅니다. 그런 다음 삽입은 정보를 네트워크로 되돌려 보낼 변경 이벤트를 트리거합니다. 이것은 무한 루프를 만듭니다.

설명이 확실한 것인지 확실하지 않습니다. 그렇지 않다면 this user은 나보다 똑같은 문제가있어서 그의 설명이 내 것보다 좋아 보인다. 그건 그렇고, 나는 거기에 제공된 답을 이해하지 못한다.

+0

에서 호출 될 때 알고 플래그를 사용하여, 예를 들어, 삽입 후 커서 위치, 그룹화 실행 취소, 왜 그것을 막으려 고합니까? –

+0

당신은 쓰고 있습니다, 나는 약간 내 질문을 변경합니다. –

답변

0

, 많은 일이 잘못 될 것입니다 당신은 변경 이벤트를 방지하는 경우 변경 이벤트가 changeFromServer

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