Хорошо, вот другой подход.
Поскольку на рендеринг вашей таблицы уходит несколько минут, после заполнения массива данных ваш единственный шанс - прослушивать событие изменения столько времени, сколько потребуется. Чтобы предотвратить запуск метода showPopUp () при каждой завершенной итерации, вы используете Observable.debounceTime (), который вызывает метод, только если время, прошедшее после последнего события изменения, больше, чем указанное время в миллисекундах.
Компонент
import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit} from '@angular/core';
import {Observable} from 'rxjs/Observable';
import {Subscription} from "rxjs/Subscription";
@ViewChild('table') table: any;
private timer= Observable.timer(1000); // wait one second before calling the method
private subscription: Subscription;
ngOnDestroy(): void {
if(this.subscription){
this.subscription.unsubscribe();
}
}
public dropped(event: UploadEvent) {
// ...
reader.readAsBinaryString(file);
this.showData = true;
this.infoModal.hide();
// call the watcher with a delay of one second
// in order to give angular enough time to build up the table
this.subscription = this.timer.subscribe( () => {
this.triggerTableWatcher();
});
// ...
}
triggerTableWatcher() {
// define the object to listen to
const trigger = this.table.changes();
// define the debounce-time (adjust it, if it doesn't fit your needs)
const debounceAt = trigger.debounceTime(1000);
// subscribe to the trigger and tell which method to call eventually
debounceAt.subscribe(() => this.showPopUp());
}
HTML-шаблон (только его важная часть)
<div class="card-body">
<div *ngIf="showData" class="upload-table table-responsive">
<table #table class="table-bordered table-striped" id="dest_table">
<tr *ngFor="let row of data">
<td *ngFor="let val of row">
{{val}}
</td>
</tr>
</table>
</div>