如何在 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.
我正在尝试在 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.