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

时间:2019-05-14 10:07:44

标签: typescript visual-studio-code ftp vscode-extensions

我正在按照this示例编写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);
}

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

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

预期结果将是:

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

如您所见,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);
}

2 个答案:

答案 0 :(得分:4)

只要打开文档,VS Code就会重复使用提供的内容。退出文档会关闭其编辑器,但会关闭文档本身。如果您完全关闭了文档(在所有选项卡中),则在打开新文档时应该会看到提供程序已被调用。

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

答案 1 :(得分:2)

如@Matt Bierner所说:

  

”“如果您希望更新现有文档的内容,请实施   TextDocumentContentProvider上的onDidChange事件,并使用它来发出信号   VS代码应调用ProvideTextDocumentContent“

我的问题是我必须用uri射击()_onDidChange。 我最终将此行添加到我的getTreeItem方法中:

this._onDidChange.fire(element.resource);

现在,每个项目在打开时都可以重新下载。