我正在按照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);
}
答案 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);
现在,每个项目在打开时都可以重新下载。