最初填充TreeView并实例化TreeView."刷新"按钮调用自定义刷新功能以收集更新的数据.这些新信息存储在上下文中.globalState()

ctmInfrastructureProvider.refresh();不会更新TreeView.我还添加了事件侦听器.

export class CtmInfrastructureProvider implements vscode.TreeDataProvider<number> {

    private _onDidChangeTreeData: vscode.EventEmitter<number | null> = new vscode.EventEmitter<number | null>();
    readonly onDidChangeTreeData: vscode.Event<number | null> = this._onDidChangeTreeData.event;
.
.
.
    constructor(private context: vscode.ExtensionContext) {
        let ctmInfrastructureCacheTmp: any = context.globalState.get('ctmInfrastructureCache');
        this.refresh();
    }
.
.
.
}

以下是我的刷新功能:

let ctmInfrastructureRefreshEntry = vscode.commands.registerCommand(
        'ctm.infrastructure.refreshEntry',
        async () => {           
ctmInfrastructureDicsovery = discoverCtmInfrastructure();                     context.globalState.update('ctmInfrastructureCache',JSON.parse(ctmInfrastructureDicsovery));
ctmInfrastructureProvider.refresh();
        }
    );
    context.subscriptions.push(ctmInfrastructureRefreshEntry);

TreeDataProvider刷新()

    refresh(offset?: number): void {
            this.parseTree();
    }
    private parseTree(): void {
        this.text = this.ctmInfrastructureCache;
        this.tree = json.parseTree(this.ctmInfrastructureCache);
    }

我错过了什么?

推荐答案

您还必须触发更改事件:

    refresh(offset?: number): void {
            this.parseTree();
        this._onDidChangeTreeData.fire();
    }

使现代化

实际上,我使用的方法与树演示略有不同:

import { TreeDataProvider, TreeItem, EventEmitter, TextDocument, ProviderResult, Event } from "vscode";
import { AntlrFacade } from "../backend/facade";

export class AntlrTreeDataProvider<T> implements TreeDataProvider<T> {
    protected currentFile: string | undefined;

    private changeEvent = new EventEmitter<void>();

    public constructor(protected backend: AntlrFacade) { }

    public get onDidChangeTreeData(): Event<void> {
        return this.changeEvent.event;
    }

    public refresh(document: TextDocument | undefined): void {
        if (document && document.languageId === "antlr" && document.uri.scheme === "file") {
            this.currentFile = document.fileName;
        } else {
            this.currentFile = undefined;
        }
        this.changeEvent.fire();
    }

    public getTreeItem(element: T): TreeItem {
        return element;
    }

    public getChildren(_element?: T): ProviderResult<T[]> {
        return undefined;
    }
}

取self 的VS代码扩展:https://github.com/mike-lischke/vscode-antlr4/blob/master/src/frontend/AntlrTreeDataProvider.ts.如您所见,我改用EventEmitter,它不需要fire()事件的参数.

Typescript相关问答推荐

在控制器中使用@ DeliverGuards时实现循环依赖项时未定义的依赖项

如何将单元测试中的私有订阅变量设置为空(或未定义)?

在Switch陈述中输入保护类

相同端点具有不同响应时的RTKQuery类型定义

更新:Typescript实用程序函数合并对象键路径

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

创建一个根据布尔参数返回类型的异步函数

使用`renderToPipeableStream`时如何正确恢复服务器端Apollo缓存?

无法从Chrome清除还原的初始状态数据

为什么T[数字]不也返回UNDEFINED?

对未到达受保护路由的路由环境做出react

是否可以针对联合类型验证类型属性名称?

是否将自动导入样式从`~/目录/文件`改为`@/目录/文件`?

尽管对象的类型已声明,但未解析的变量<;变量

在VSCode中显示eslint错误,但在终端中运行eslint命令时不显示?(Vite,React,TypeScript)

返回嵌套props 的可变元组

创建依赖函数参数的类型

有没有一种方法可以提升对象的泛型级别,而对象的值是泛型函数?

递归JSON类型脚本不接受 node 值中的变量

具有枚举泛型类型的 Typescript 对象数组