2015-05-28 2 views
0

Мне немного сложно вставить новую строку программно с помощью javascript.Ace.js Программно добавить новую строку

Позвольте мне рассказать вам немного о моем проекте. Во-первых, это означает, что он будет интерактивной совместной IDE с использованием ACE.JS и SignalR, чтобы разрешить редактирование в режиме реального времени более чем одним человеком.

Для достижения этой цели я зацепил в к ace.js случае изменения редакторов:

editor.getSession().on('change', function (e) {}); 

Я тогда слушать к действию, что пользователь выполнил и действовать соответствующим образом с помощью переключателя заявление. Таким образом, событие on change выглядит так:

editor.getSession().on('change', function (e) { 
      console.log(self.fromserver); 
      if (self.wasMe) { 
       self.wasMe = false; 
       return; 
      } 
      switch(e.data.action) { //what action did this user perform? 
       case "insertText": 
        if (!self.fromserver) {//to prevent an 'n' event loop, check if event came from server 

        } else { 

        } 

        break; 
       case "insertLines": 

        if (!self.fromserver) {      


        } else { 

        } 
        break; 
       case "removeText": 

         var position = JSON.stringify(e.data.range); 
         if (!self.fromserver) { 
          self.ide.server.removeSyntax(position); 
         } else { 
          self.fromserver = false; 
         } 

         break; 
       case "removeLines": 
        var lines = JSON.stringify(e.data.range); 
        if (!self.fromserver) { 
         self.ide.server.removeLines(lines); 
        } 
        break; 
      } 
      self.fromserver = false; 
      console.log(e.data); 
     }); 

Вставка текста, вставка текста и удаление текста (плюс удаление блоков текста) работают правильно.

Проблема

Новые линии с отступом! Возьмем, к примеру, пользователь напечатал следующий код:

function(){ 

, когда пользователь нажимает ввести блок-код отформатирован следующим образом:

function(){ 
    //indentation 
} 

Изменение событий, вызвавших это посылаются на сервер так что другие пользователи обновляются, сервер вызывает функцию на клиентских компьютерах в зависимости от действия пользователя. Это может быть либо editor.session.insert //add text или editor.session.remove //remove text или (в настоящее время), для новых линий self.editor.insertNewLine(range.end.row, line);

Проблема заключается в том, что клиентские машины, которые обновляются с сервера не вкладку правильно, это приводит к их редактор рассинхронизации.

Вопрос

Мой вопрос к вам, ребятам есть ли у ace.js редактора есть функция «формат»? Я попробовал функцию editor.indent, но это, похоже, не работает должным образом.

Любая помощь будет высоко оценена.

ответ

1

В моем случае у меня есть каждая строка уникального скрытого целочисленного числа, сгенерированного сервером, при обновлении я отправляю этот номер всем клиентам вместе с строкой в ​​строчном формате, который включает отступ и разрыв строки .... все это!

Кроме того, я сохранил эти строки в sql, так что, когда клиент находится в автономном режиме, он будет обновляться в режиме онлайн.

+0

Спасибо, Кеннет, я считаю, что мне нужно переосмыслить информацию, которую я отправляю на сервер. но это похоже на лучший способ сделать это (держит всех в синхронизации с сервером, не позволяет редактору принимать ввод). Так что спасибо. Jay – Jay

+0

не забудьте добавить еще один скрытый номер, порядок отображения, например. в случае, если пользователь добавит строку между строкой 2 и линией 3 –

Смежные вопросы