Vscode API - предоставляет текстовый документ, не выполняющийся более одного раза - PullRequest
6 голосов
/ 14 мая 2019

Я пишу расширение 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 вызывать его для каждого клика?

EDIT: В настоящее время у меня есть событие 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 ]

4 голосов
/ 14 мая 2019

VS Code будет повторно использовать предоставленный контент, пока документ открыт.Отключение от документа закрывает его редактор, но закрывает сам документ.Если вы полностью закроете документ (на всех вкладках), вы должны увидеть провайдера, вызванного при открытии нового документа.

Если вы хотите обновить содержимое существующего документа, внедрите событие onDidChange в TextDocumentContentProvider и используйте его, чтобы сообщить, что VS Code должен вызвать provideTextDocumentContent

2 голосов
/ 21 мая 2019

Как сказал @Matt Bierner:

"Если вы хотите обновить содержимое существующего документа, выполните Событие onDidChange на TextDocumentContentProvider и использовать его для сигнализации этот код VS должен вызывать provideTextDocumentContent "

Моя проблема заключалась в том, что мне пришлось стрелять () _onDidChange с Ури. Я добавил эту строку в мой getTreeItem метод:

this._onDidChange.fire(element.resource);

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

...