如何在 TreeView class 的 refresh() 函数中访问 context.globalState?

How to access context.globalState inside a refresh() function of a TreeView class?

我正在尝试在 TreeView refresh() 函数中访问 context.globalState.get('data');。 我的 refresh() 看起来像这样:

    refresh(offset?: number): void {
        this.ctmInfrastructureCache = getGlobalStateData();
        this.parseTree();
        if (offset) {
            this._onDidChangeTreeData.fire(offset);
        } else {
            this._onDidChangeTreeData.fire(undefined);
        }

    }

全局状态数据应该由以下人员提供:

export function getGlobalStateData(): string {
    const data: string = context.globalState.get('ctmInfrastructureCache');
    return data;
}

但是,我无法访问 context.globalState。我得到:

Property 'globalState' does not exist on type 'SuiteFunction'.ts(2339)

在调用刷新并将其分配给 globalState 上下文之前收集新数据。我只想获取数据并将其作为新 TreeView 的输入。

我试过将 context: vscode.ExtensionContext 添加到 refresh() 中,但没有成功。 如何在刷新中访问 globalState

class constructor() 可以访问 globalState。这是有效的:

    constructor(context: vscode.ExtensionContext) {
        let ctmInfrastructureCacheTmp: any = context.globalState.get('ctmInfrastructureCache');
        let ctmInfrastructureCacheType: any = typeof ctmInfrastructureCacheTmp;

        // check if json needs to be converted
        if (ctmInfrastructureCacheType === "string") {
            this.ctmInfrastructureCache = ctmInfrastructureCacheTmp;
        } else {
            this.ctmInfrastructureCache = JSON.stringify(ctmInfrastructureCacheTmp);
        }
        this.parseTree();
    }

您缺少的是上下文已传递给构造函数,因此它可以在那里访问它。在您的 getGlobalStateData() 函数中 context 是未知的。对 context 的引用可能引用了不同的上下文对象。

一个可能的解决方案是保留对 context 的引用并将其用作 class:

的成员
    public constructor(private context: vscode.ExtensionContext) {
        let ctmInfrastructureCacheTmp: any = context.globalState.get('ctmInfrastructureCache');
        let ctmInfrastructureCacheType: any = typeof ctmInfrastructureCacheTmp;

        // check if json needs to be converted
        if (ctmInfrastructureCacheType === "string") {
            this.ctmInfrastructureCache = ctmInfrastructureCacheTmp;
        } else {
            this.ctmInfrastructureCache = JSON.stringify(ctmInfrastructureCacheTmp);
        }
        this.parseTree();
    }

    public refresh(offset?: number): void {
        this.ctmInfrastructureCache = this.context.globalState.get('ctmInfrastructureCache');
        this.parseTree();
        if (offset) {
            this._onDidChangeTreeData.fire(offset);
        } else {
            this._onDidChangeTreeData.fire(undefined);
        }

    }

根据迈克的建议,我更新了代码,现在可以使用了。 首先,我将 'context' 添加到我的 refresh().

的 registerCommand() 部分
ctmInfrastructureProvider.refresh(undefined, context);

然后我像这样更新了刷新函数,将 'context?: vscode.ExtensionContext' 作为可选输入。

    public refresh(offset?: number, context?: vscode.ExtensionContext): void {
        // get globalState data
        let ctmInfrastructureCacheTmp: any = context.globalState.get('ctmInfrastructureCache');
        let ctmInfrastructureCacheType: any = typeof ctmInfrastructureCacheTmp;

        // check if json needs to be converted
        if (ctmInfrastructureCacheType === "string") {
            this.ctmInfrastructureCache = ctmInfrastructureCacheTmp;
        } else {
            this.ctmInfrastructureCache = JSON.stringify(ctmInfrastructureCacheTmp);
        }

        this.parseTree();
        if (offset) {
            this._onDidChangeTreeData.fire(offset);
        } else {
            this._onDidChangeTreeData.fire(undefined);
        }

    }

问候,O.