首页 > 解决方案 > VS 代码扩展开发:可以取消注册事件处理程序

问题描述

在我的扩展中,我想在用户发出命令时注册一个事件监听器,但在用户发出另一个命令时取消注册监听器(或将监听器更新为其他东西)。

例如,在命令 A 结束时,我注册window.onDidChangeActiveTextEditor为某物(在我的情况下,我将其注册到命令 A 处理程序)。在命令 B 结束时,我想取消注册此注册。我知道window.onDidChangeActiveTextEditor会返回一个 Disposable,但我不知道如何将这个 Disposable 传递给命令 B。

我的代码结构是这样的:

vscode.commands.registerCommand('A', () => {commandA()});
vscode.commands.registerCommand('B', () => {commandB()});

commandA() {
...
vscode.window.onDidChangeActiveTextEditor(() => {commandA();})
}

commandB() {
...
// How do I unregister the event listener?
}

标签: visual-studio-codevscode-extensions

解决方案


使用评论中@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;
}

推荐阅读