Автозаполнение редактора ACE для объекта

Допустим, у меня есть объект foo с двумя ключами bar, baz. Я хочу создать собственный getCompletions, чтобы при вводе foo. отображались bar и baz. Как мне это сделать? Переменная prefix в обратном вызове содержит только самую последнюю нажатую клавишу.

В моем реальном примере мне нужно было бы сделать вызов AJAX, чтобы получить ключи foo, прежде чем делать это, поэтому мне нужно настраиваемое автоматическое завершение.

Вы хотите отображать автозаполнение с помощью bar, baz, когда пользователь вводит foo с "."?

Harsha pps 18.06.2018 15:04

@Harshapps да. И у меня тоже включен enableLiveAutocompletion, поэтому автозаполнение срабатывает всякий раз, когда пользователь нажимает клавишу.

Kousha 18.06.2018 18:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
1 708
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо использования префикса в getCompletions вы можете привязать ключ "." а затем создайте свой список слов. Вы можете сделать свой wordList глобальным и использовать его внутри getCompletions или после привязки "." используйте этот код, чтобы получить предыдущий элемент, т.е. foo, а затем вставить значение в редактор.

Например, если мы возьмем wordList как глобальный массив, а затем, когда пользователь введет foo. мы можем добавить оба слова в список слов, а затем использовать их в автозаполнении.

editor.commands.addCommand({
    name: "dotCommand1",
    bindKey: { win: ".", mac: "." },
    exec: function () {
        var pos = editor.selection.getCursor();
        var session = editor.session;

        var curLine = (session.getDocument().getLine(pos.row)).trim();
        var curTokens = curLine.slice(0, pos.column).split(/\s+/);
        var curCmd = curTokens[0];
        if (!curCmd) return;
        var lastToken = curTokens[curTokens.length - 1];

        editor.insert(".");                

        if (lastToken === "foo") {
            // Add your words (bar, baz) to the global word list so that the autocomplete can show both bar, baz
           // Append the words to wordList here
        }
    }
});

Внутри автозаполнения мы можем отобразить список слов

var staticWordCompleter = {
getCompletions: function(editor, session, pos, prefix, callback) {

    callback(null, wordList.map(function(word) {
        return {
            caption: word,
            value: word,
            meta: "static",
            completer: {
                insertMatch: function(editor, data) {
                    var insertedValue = data.value;
                    if (insertedValue === "bar" || insertedValue === "baz") {
                        // You can clear the world list here
                    }
                }
            }
        };
    }));
  }
}
editor.completers = [staticWordCompleter];

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

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

Как удалить списки слов? Похоже, как только я доберусь до foo., bar, baz навсегда останется в wordList. Нужно ли мне постоянно обновлять wordList и убирать опции автозаполнения ??

Kousha 20.06.2018 00:37

Вы можете использовать опцию insertMatch в программе завершения, которая будет вызываться после того, как вы нажмете на полосу или базу в списке автозаполнения, а затем вы сможете очистить список. Обновил ответ, добавив insertMatch

Harsha pps 20.06.2018 08:29

Спасибо, это отлично работает. Последний вопрос. В любом случае, чтобы автоматически открыть окно предложений на ., нажмите? Прямо сейчас вам все еще нужно ввести следующее слово, чтобы открылось меню автозаполнения. Хочу на foo., как только нажимается ., открывалось меню

Kousha 20.06.2018 19:46

Я рад, что решение сработало :) И на самом деле нет возможности вызвать автозаполнение, он вызывается, когда пользователь действительно что-то вводит.

Harsha pps 21.06.2018 06:18

Хорошо, это лучше, чем ничего. Кроме того, я заметил, что при использовании вашего решения я не могу на самом деле выбрать варианты завершения (т.е. если я наберу foo.b, а затем с помощью клавиатуры прокрутите вниз до bar и нажмите клавишу ВВОД, ничего не произойдет; панель предложений просто закрывается)

Kousha 21.06.2018 07:56

Привет, я обновил ответ, не могли бы вы проверить, поможет ли это вам

Harsha pps 21.06.2018 16:31

это не работает, если вы, например, находитесь внутри скобок if.

undefined 21.10.2018 15:53

@undefined не понял, что у вас не работает, можете подробнее объяснить или показать рабочий образец?

Harsha pps 22.10.2018 04:34

попробуйте использовать его внутри блока if, например: if (foo.

undefined 22.10.2018 06:31

Последний токен будет "if (foo"

undefined 22.10.2018 06:32

Другие вопросы по теме