#visual-studio-code #vscode-extensions
Вопрос:
В моем расширении я хотел бы зарегистрировать прослушиватель событий, когда пользователь выдает команду, но отменяет регистрацию прослушивателя (или обновляет прослушиватель на что-то другое), когда пользователь выдает другую команду.
Например, в конце команды A я регистрируюсь window.onDidChangeActiveTextEditor
как нечто (в моем случае я зарегистрировал это в обработчике команды A). В конце команды B я хотел бы отменить эту регистрацию. Я понимаю window.onDidChangeActiveTextEditor
, что вернет одноразовый, но я не знаю, как бы я передал этот одноразовый командованию B.
Моя структура кода такова:
vscode.commands.registerCommand('A', () => {commandA()});
vscode.commands.registerCommand('B', () => {commandB()});
commandA() {
...
vscode.window.onDidChangeActiveTextEditor(() => {commandA();})
}
commandB() {
...
// How do I unregister the event listener?
}
Комментарии:
1. сохраните дескриптор в (глобальной) переменной и вызовите
dispose()
метод вcommandB
Ответ №1:
Решил эту проблему, используя подсказку от @rioV8 в комментариях. Преобразуйте код в структуру ваших потребностей, как класс.
let changeHandle = null;
vscode.commands.registerCommand('A', commandA);
vscode.commands.registerCommand('B', commandB);
commandA() {
if (!changeHandle)
changeHandle = vscode.window.onDidChangeActiveTextEditor(commandA);
}
commandB() {
changeHandle?.dispose();
changeHandle = null;
}
Комментарии:
1. Подробнее смотрите здесь: code.visualstudio.com/api/references/vscode-api#events
2. Чтобы это сработало, вам также необходимо установить
changeHandle = null;
в конце CommandB(). Но спасибо! Это работает.3. @Go_printf, ты прав. Будет соответствующим образом обновлен код.