У меня есть функция загрузки, которая запускается нажатием кнопки. Когда это произойдет, я хочу отобразить индикатор выполнения / счетчик, пока выполняется сетевой вызов, а затем скрыть индикатор / счетчик после начала загрузки.
Я буду использовать angular material mat-progress- бар. Моя идея состояла в том, чтобы прослушать начало сетевого вызова и определить его как isLoading = true, а его завершение, которое приведет к ссылке на файл или ошибке, установит isLoading = false, чтобы скрыть индикатор выполнения, например
<mat-progress-bar mode="indeterminate *ngIf
="isLoading"</mat-progress-bar>
для отображения и скрытия индикатора выполнения.
Я попытался сделать это, выполнив что-то вроде:
this.documents.find(document => document.id
=== element.id).isLoading = true
, а затем определив isLoading как false в моей подписке, но это не совсем то, что Мне нужно это сделать.
Это моя функция загрузки:
download(element: Document | TDoc, index:
number) {if (
(!this.isTDoc && !
(<Document>element).files.length) ||
(this.isTDoc && !(<isTDoc>element).url)
)
return;
if (this.isTDoc) {
const url = (<TDoc>element).url;
const fileName = `${(<TDoc>element).itemName}.pdf`;
downloadLink(url, fileName);
} else {
const query = 'index=' + index.toString();
this.documentService
.downloadDocument((<Document>element).serialnumber, query)
.pipe(
filter(res => !!res),
take(1)
)
.subscribe(res => {
const fileName = `${(<Document>element).serialnumber}.pdf`;
downloadBlob([res], fileName, 'application/pdf');
});
}
Мой сервис документов: ...
downloadDocument(serialNumber: string, query:
string) {
const url = someURL(serialNumber, query);
return this.dataService.asyncRequest(
RequestTypes.GET,
url,
null,
ServerHosts.TDocSERVER,
{
responseType: 'arraybuffer'
}
);
Моя другая попытка была создать Файл DocumentDownloadActions, определите REQUEST / SUCCESS / FAILURE и затем isLoading = true при вызове функции, а затем, как и ранее, завершите при наличии файла или ошибки.
this.someDownloadService.get('someApiUrl',
somePayload).pipe(
map((res) => {
this.dispatch(new DownloadSuccessAction());
return res;
}),
catch((err) => {
this.dispatch(new DownloadFailureAction());
})
Было бы лучше прослушивать HTTP-вызов способ сделать это, так как я мог сопоставить индикатор выполнения с прогрессом сети, используя Value?