Ace Автозаполнение, когда ничего не напечатано - PullRequest
0 голосов
/ 14 декабря 2018

Я редактирую JSON с помощью Ace Editor.Каждый ключ в моем объекте json имеет соответствующий список возможных значений.Я хочу отобразить соответствующий список значений с помощью автозаполнения, когда пользователь редактирует значение JSON.

Это в основном работает во фрагменте ниже.Единственная проблема в том, что вам нужно набрать хотя бы один символ, чтобы автозаполнение сработало.Если вы просто удалите значение полностью, автозаполнение не сработает.Есть ли способ вызвать автозаполнение даже после удаления значения?

<style>
  #editor {
    width: 500px;
    height: 500px;
  }
</style>

<div id="editor">{
  "color": "red",
  "animal": "elephant"
}</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.2/ace.js" type="text/javascript" charset="utf-8"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.2/ext-language_tools.js" type="text/javascript" charset="utf-8"></script>
<script>
  var langTools = ace.require("ace/ext/language_tools");

  var editor = ace.edit("editor");
  editor.setTheme("ace/theme/monokai");
  editor.session.setMode("ace/mode/json");
  editor.setOptions({
    enableLiveAutocompletion: true,
  });

  langTools.setCompleters([{
    getCompletions: function(editor, session, pos_obj, prefix, callback) {
      console.log('getCompletions')
      const content = editor.session.getValue()
      const lines = content.split('\n')
      const line = lines[pos_obj.row]
      if(line.match(/\bcolor\b/))
        callback(null, [
          {name: "red", value: "red", score: 1000, meta: "color"},
          {name: "green", value: "green", score: 1000, meta: "color"},
          {name: "blue", value: "blue", score: 1000, meta: "color"}
        ])
      else if(line.match(/\banimal\b/))
        callback(null, [
          {name: "hamster", value: "hamster", score: 1000, meta: "template"},
          {name: "elephant", value: "elephant", score: 1000, meta: "template"}
        ])
      else
        callback(null, [])
    }
  }]);

</script>

http://plnkr.co/edit/mozSmuzhbEE84LOROKJC?p=preview

1 Ответ

0 голосов
/ 14 декабря 2018

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

editor.commands.on("afterExec", function (e) {
    if (e.command.name == "insertstring" && /^[\w.]$/.test(e.args)) {
        editor.execCommand("startAutocomplete");
    }
});
...