vsCode refre sh дерево при добавлении нового элемента - PullRequest
4 голосов
/ 25 марта 2020

Я использую следующий код для отображения элементов дерева,

https://github.com/microsoft/vscode-extension-samples/tree/master/tree-view-sample

Элементы, отображаемые в дереве, относятся к файлу, если файл изменен, количество элементов дерева должно быть изменено соответствующим образом (используя createFileSystemWatcher, который работает нормально), в настоящее время я добавляю код средства просмотра файлов, и при отладке он останавливается там (на функции getChildren, когда я изменяя файл), и я вижу, что я предоставил новые обновленные записи (в коде), однако дерево не обновилось с новыми данными. Я здесь скучаю? каким-то образом новые обновленные данные не отражаются в дереве. как я новичок в этом топи c может быть, я что-то упустил. если код в порядке и есть ошибка, или она не поддерживается, пожалуйста, дайте мне знать.

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();
  }

}

Если чего-то не хватает, пожалуйста, дайте мне знать, и я добавлю, я действительно застрял с этим.

Если есть другой способ обновить дерево sh, пожалуйста, дайте мне знать

1 Ответ

1 голос
/ 31 марта 2020

Последняя строка в конструкторе мне кажется подозрительной.

fileWatcher.onDidChange(() => (this.eeake = this.getChildren()), this.refresh());

Я полагаю, вы имеете в виду:

fileWatcher.onDidChange(() => {
  this.eeake = this.getChildren();
  this.refresh();
});

Ваш исходный код фактически сразу вызывает this.refresh() в конструкторе и передает возврат значение как 2-й аргумент до fileWatcher.onDidChange(). this.refresh() не был частью слушателя, переданного как 1-й аргумент onDidChange().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...