vsCode 添加新项目时刷新树
vsCode refresh tree when adding new Item
我使用下面的代码来显示树项,
https://github.com/microsoft/vscode-extension-samples/tree/master/tree-view-sample
树中显示的项目与文件相关,如果文件更改,树项目的数量应相应更改(使用 createFileSystemWatcher
可以正常工作),目前我已经添加文件观察器的代码和调试时它停在那里(当我更改文件时在 getChildren
函数上)我看到我已经提供了 new updated条目(在代码中),但是树没有用新数据刷新,知道我在这里遗漏了什么吗?不知何故,新的更新数据没有反映在树中。因为我是这个话题的新手,所以我可能会错过一些东西。如果代码没问题但有错误或不支持请告诉我。
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();
}
}
如果有什么遗漏请告诉我,我会补充,我真的坚持不懈。
如果有其他刷新树的方法请告诉我
构造函数中的最后一行在我看来很可疑。
fileWatcher.onDidChange(() => (this.eeake = this.getChildren()), this.refresh());
我相信你的意思是:
fileWatcher.onDidChange(() => {
this.eeake = this.getChildren();
this.refresh();
});
您的原始代码实际上立即在构造函数中调用 this.refresh()
并将 return 值作为 第二个参数 传递给 fileWatcher.onDidChange()
。 this.refresh()
不是作为第一个参数传递给 onDidChange()
的侦听器的一部分。
我使用下面的代码来显示树项,
https://github.com/microsoft/vscode-extension-samples/tree/master/tree-view-sample
树中显示的项目与文件相关,如果文件更改,树项目的数量应相应更改(使用 createFileSystemWatcher
可以正常工作),目前我已经添加文件观察器的代码和调试时它停在那里(当我更改文件时在 getChildren
函数上)我看到我已经提供了 new updated条目(在代码中),但是树没有用新数据刷新,知道我在这里遗漏了什么吗?不知何故,新的更新数据没有反映在树中。因为我是这个话题的新手,所以我可能会错过一些东西。如果代码没问题但有错误或不支持请告诉我。
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();
}
}
如果有什么遗漏请告诉我,我会补充,我真的坚持不懈。
如果有其他刷新树的方法请告诉我
构造函数中的最后一行在我看来很可疑。
fileWatcher.onDidChange(() => (this.eeake = this.getChildren()), this.refresh());
我相信你的意思是:
fileWatcher.onDidChange(() => {
this.eeake = this.getChildren();
this.refresh();
});
您的原始代码实际上立即在构造函数中调用 this.refresh()
并将 return 值作为 第二个参数 传递给 fileWatcher.onDidChange()
。 this.refresh()
不是作为第一个参数传递给 onDidChange()
的侦听器的一部分。