Javascript 添加新项时vsCode刷新树
我使用以下代码显示树项目 树中显示的项目与文件相关,如果文件更改,则树项目的数量应相应更改(使用Javascript 添加新项时vsCode刷新树,javascript,node.js,typescript,vscode-extensions,vscode-tasks,Javascript,Node.js,Typescript,Vscode Extensions,Vscode Tasks,我使用以下代码显示树项目 树中显示的项目与文件相关,如果文件更改,则树项目的数量应相应更改(使用createFileSystemWatcher,其工作正常),当前我已添加文件查看器的代码,调试时停止(当我更改文件时,在getChildren函数上)我看到我提供了新更新的条目(在代码中),但是树没有用新数据刷新,知道我这里缺少什么吗?不知何故,新更新的数据没有反映在树中。由于我不熟悉这个话题,我可能错过了一些东西。如果代码是正常的,有一个错误或这是不支持的,请让我知道 export class
createFileSystemWatcher
,其工作正常),当前我已添加文件查看器的代码,调试时停止(当我更改文件时,在getChildren
函数上)我看到我提供了新更新的条目(在代码中),但是树没有用新数据刷新,知道我这里缺少什么吗?不知何故,新更新的数据没有反映在树中。由于我不熟悉这个话题,我可能错过了一些东西。如果代码是正常的,有一个错误或这是不支持的,请让我知道
export class TaskTreeDataProvider implements vscode.TreeDataProvider<TreeItem> {
private _onDidChangeTreeData: vscode.EventEmitter<TreeItem | null> = new vscode.EventEmitter<TreeItem | null>();
readonly onDidChangeTreeData: vscode.Event<TreeItem | null> = this
._onDidChangeTreeData.event;
private eeake: Promise<TreeItem[]> | undefined = undefined;
private autoRefresh: boolean = true;
constructor(private context: vscode.ExtensionContext) {
this.autoRefresh = vscode.workspace
.getConfiguration(“sView")
.get("autorefresh");
let filePath = this.fileName;
let fileWatcher = vscode.workspace.createFileSystemWatcher(filePath);
fileWatcher.onDidChange(() => (this.eeake = this.getChildren()), this.refresh());
}
refresh(): void {
this._onDidChangeTreeData.fire();
}
public async getChildren(task?: TreeItem): Promise<TreeItem[]> {
let tasks = await vscode.tasks
.fetchTasks({ type: “run” })
.then(function (value) {
return value;
});
let entry: TreeItem[] = [];
if (tasks.length !== 0) {
for (var i = 0; i < tasks.length; i++) {
entry[i] = new TreeItem(
tasks[i].definition.type,
tasks[i].name,
{
command: “sView.executeTask",
title: "Execute",
arguments: [tasks[i]]
}
);
}
}
return entry;
}
getTreeItem(task: TreeItem): vscode.TreeItem {
return task;
}
}
class TreeItem extends vscode.TreeItem {
type: string;
constructor(
type: string,
label: string,
collapsibleState: vscode.TreeItemCollapsibleState,
command?: vscode.Command
) {
super(label, collapsibleState);
this.type = type;
this.command = command;
this.iconPath = getIcon();
}
}
导出类TaskTreeDataProvider实现vscode.TreeDataProvider{
private _onDidChangeTreeData:vscode.EventEmitter=新的vscode.EventEmitter();
只读onDidChangeTreeData:vscode.Event=this
._onDidChangeTreeData.event;
私有eeake:承诺|未定义=未定义;
私有自动刷新:布尔值=true;
构造函数(专用上下文:vscode.ExtensionContext){
this.autoRefresh=vscode.workspace
.getConfiguration(“sView”)
.get(“自动刷新”);
让filePath=this.fileName;
让fileWatcher=vscode.workspace.createFileSystemWatcher(filePath);
fileWatcher.onDidChange(()=>(this.eeake=this.getChildren()),this.refresh());
}
刷新():无效{
这是一场火灾;
}
公共异步getChildren(任务?:TreeItem):承诺{
让任务=等待vscode.tasks
.fetchTasks({type:“run”})
.然后(函数(值){
返回值;
});
let entry:TreeItem[]=[];
如果(tasks.length!==0){
对于(变量i=0;i
如果有什么遗漏,请让我知道,我补充说,我真的被它卡住了
如果有其他方法刷新树,请告诉我构造函数中的最后一行对我来说可疑
fileWatcher.onDidChange(() => (this.eeake = this.getChildren()), this.refresh());
我相信你的意思是:
fileWatcher.onDidChange(() => {
this.eeake = this.getChildren();
this.refresh();
});
您的原始代码实际上立即调用构造函数中的
this.refresh()
,并将返回值作为第二个参数传递给fileWatcher.onDidChange()
this.refresh()
不是作为第一个参数传递给onDidChange()的侦听器的一部分
我不确定我是否从问题中得到了正确答案,但您是说“我看到我提供了新的更新条目(在代码中)”-是否条目
也在运行时包含新的更新项(如果您在那里设置了断点)?除此之外,一切看起来都很好。我正在对我的扩展进行类似的操作:@MoshFeu-谢谢,是的,完全正确!在运行时(通过调试),我看到所有内容都更新了,提供了新条目/删除了条目。但是,树没有反映这一点,我从一开始就看到条目,任何更改都不会反映在树中。如果您有任何提示,请告诉我。谢谢!我看不出原因。但是(尽管这不是StackOverflow策略的一部分)如果您的回购是公开的(在Github或其他网站上)我可以试着看一看,也许会有什么东西跳转。fileWatcher.onDidChange(()=>(this.eeake=this.getChildren()),this.refresh();
这行对我来说很可疑。我相信你的意思是:fileWatcher.onDidChange(()=>{this.eeake=this.getChildren();返回this.refresh())
@hackape-你能把它写下来作为答案吗?我会相应地修改我的代码,让你知道。非常感谢!我错过了这一部分…因为这是我的第一个typescript项目和vscode。如果你能对其余的代码提供反馈,那就太好了。谢谢!^对不起,我没有vscode扩展的经验。我只能帮助你注意这个错误,但是我不能对你的代码做太多评论。