Извините, если бы мог, я бы опубликовал это как вопрос, но пока не могу, так что это ответ:
Я немного постарался.Если будет нормально отключить спиннер, как только пользователь нажмет кнопку, появится возможность начать загрузку по событию щелчка ввода и отменить загрузку в методе onChange.
Проблема со спиннером / загрузчиком заключается в том, что, насколько я понял, отмена диалога загрузки ничего не вызывает.Отсюда возникает вопрос, каково было бы правильное время для остановки таймера в этом случае?
Существует возможность зарегистрировать это для события размытия.Этот подход предполагает, однако, что пользователь щелкнет где-то на странице, как только он закроет диалог загрузки.Не слишком уверен, если это на самом деле вариант для вас.
component.ts
fileUpload: any;
loading: boolean;
@ViewChild('inputFile') inputFile;
@ViewChild('buttonElem') buttonElem;
onChange(event: any) {
this.loading = false;
this.fileUpload = event.target.files[0];
}
onBlur() {
if(this.loading && document.activeElement !==
this.buttonElem.nativeElement) {
this.loading = false;
}
}
openDialog() {
this.inputFile.nativeElement.value = '';
this.inputFile.nativeElement.click();
}
шаблон
<div>
<button #buttonElem mat-raised-button (blur)="onBlur()"
(click)="openDialog()">Choose a file</button>
<input #inputFile type="file" [style.display]="'none'" (click)="loading =
true" (change)="onChange($event)">
<label *ngIf="fileUpload">{{fileUpload.name}}</label>
</div>
<div>
Loading: {{loading}}
</div>
Вот блик стека: стек блика