VScode API-ProvideTextDocument不会执行一次以上

m4d*_*k3y 6 ftp typescript visual-studio-code vscode-extensions

我在示例后编写一个Vscode FTP扩展名。

我的问题是,似乎provideTextDocumentContent每个文件仅被调用一次。再次打开文件不会调用该函数。相反,它仅显示已加载的内容。

请参考下面的代码:

public provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult<string> {
    console.log('uri.path');
    return this.model.getContent(uri).then(content => content);
}
Run Code Online (Sandbox Code Playgroud)

这些是我在视图上单击项目时的结果

log=> '/index.cfml'   // Clicked on index.cfml
log=> '/login.cfml'   // Clicked on login.cfml
log=>                 // Clicked on index.cfml
log=>                 // Clicked on login.cfml
log=> '/signup.cfml'  // Clicked on signup.cfml
Run Code Online (Sandbox Code Playgroud)

预期结果将是:

log=> '/index.cfml'   // Clicked on index.cfml
log=> '/login.cfml'   // Clicked on login.cfml
log=> '/index.cfml'   // Clicked on index.cfml
log=> '/login.cfml'   // Clicked on login.cfml
log=> '/signup.cfml'  // Clicked on signup.cfml
Run Code Online (Sandbox Code Playgroud)

如您所见provideTextDocumentContent,第一次单击某个项目被调用,但是第二次单击同一项目却没有被调用。知道为什么会发生这种情况,或者我如何才能强制vscode每次点击调用它?

编辑: 我目前onDidChange在我的数据提供者的顶部有一个事件,但实现可能是错误的。以下是我的数据提供者的外观摘要。

export class FtpTreeDataProvider implements vscode.TreeDataProvider<FtpNode>, vscode.TextDocumentContentProvider {

private _onDidChangeTreeData: vscode.EventEmitter<any> = new vscode.EventEmitter<any>();
readonly onDidChangeTreeData: vscode.Event<any> = this._onDidChangeTreeData.event;

constructor(private readonly model: FtpModel){ }

public refresh(): any {
    this._onDidChangeTreeData.fire();
}

public getTreeItem(element) {/*some code*/}
public getChildren(element) {/*some code*/}
public getParent(element) {/*some code*/}

public provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult<string> {
    console.log(uri.path);
    return this.model.getContent(uri);
}
Run Code Online (Sandbox Code Playgroud)

m4d*_*k3y 2

正如@Matt Bierner 所说:

“如果您希望更新现有文档的内容,请在 TextDocumentContentProvider 上实现 onDidChange 事件,并使用它来指示 VS Code 应调用 ProvideTextDocumentContent”

我的问题是我必须用_onDidChangeuri 来 fire() 。我最终将这一行添加到我的getTreeItem方法中:

this._onDidChange.fire(element.resource);

现在每个项目都是在打开时重新下载的。