Я использую ng-idle / core для реализации всплывающего окна ожидания простоя, счетчик минут и секунд отображается правильно, однако, когда счетчик перемещается от 60 секунд до 58 секунд, он выдает ошибку типа «TypeError: Невозможно установить свойство countMinutes» of null ", однако счетчик продолжает падать, и после 0 секунд он также успешно выходит из системы.
Я попытался поставить нулевую проверку вокруг экземпляра компонента, тогда счетчик не достигнет 0, в промежутке между вызовами и выходом из системы.
export class TimeOutInvokingComponent implements OnInit {
timedOut = false;
countDown: number;
idleTimeOutdialogRef: MatDialogRef<IdleTimeOutComponent>;
activityTimerSubscription: Subscription;
constructor(private idle: Idle,
public idleTimeWarnDialog: MatDialog,
public sessionExpiredInfoDialog: MatDialog//, private appComponent: AppComponent
,private authService: MsalService
) {
idle.setIdle(environment.idle_warning_time);
idle.setTimeout(environment.idle_counter_time);
idle.setInterrupts(DEFAULT_INTERRUPTSOURCES);
idle.onTimeout.subscribe(() => {
this.timedOut = true;
this.closeidleTimeOutPopup();
this.stopidleTimer();
this.logout();
});
idle.onIdleStart.subscribe(() => {
this.openSessionTimeOutDialog(1);
});
idle.onTimeoutWarning.subscribe((countdown: any) => {
this.countDown = countdown;
// if(this.idleTimeOutdialogRef.componentInstance && this.idleTimeOutdialogRef.componentInstance != null){
//alert(typeof this.idleTimeOutdialogRef);
this.idleTimeOutdialogRef.componentInstance.countMinutes = (Math.floor(countdown / 60));
this.idleTimeOutdialogRef.componentInstance.countSeconds = countdown % 60;
//}
});
this.idle.onIdleEnd.subscribe(() => {
console.log('on idle end');
});
}
ngOnInit() { }
openSessionTimeOutDialog(count: number) {
const timeOutWarndialogConfig = new MatDialogConfig();
timeOutWarndialogConfig.disableClose = true;
timeOutWarndialogConfig.autoFocus = true;
timeOutWarndialogConfig.panelClass = 'custom-modalbox';
timeOutWarndialogConfig.data = {
sessionExpiry: false,
countdown : this.countDown,
countMinutes : (Math.floor(this.countDown / 60)),
countSeconds : this.countDown % 60
};
this.idleTimeWarnDialog.closeAll();
this.idleTimeOutdialogRef = this.idleTimeWarnDialog.open(
IdleTimeOutComponent,
timeOutWarndialogConfig
);
this.idleTimeOutdialogRef.componentInstance.countdown = count;
this.idleTimeOutdialogRef.afterClosed().subscribe((result: any) => {
//console.log(result);
if (result !== '' && 'logout' === result) {
//console.log('Logout is initiate');
const sessionExpdialogConfig = new MatDialogConfig();
sessionExpdialogConfig.disableClose = true;
sessionExpdialogConfig.autoFocus = true;
sessionExpdialogConfig.panelClass = 'custom-modalbox';
sessionExpdialogConfig.data = {
sessionExpiry: true
};
this.sessionExpiredInfoDialog.closeAll();
const sessionExpireRef = this.sessionExpiredInfoDialog.open(IdleTimeOutComponent, sessionExpdialogConfig);
sessionExpireRef.afterClosed().subscribe((result: any) => {
if (result !== '' && 'logout' === result) {
this.stopidleTimer();
//this.appComponent.logout();
this.logout();
}
else {
this.initiateIdleTimer();
}
});
}
});
}
initiateIdleTimer() {
alert("Initiate idle timer");
this.idle.watch();
this.timedOut = false;
}
initiateActivityTimer() {
this.activityTimerSubscription = interval(environment.activity_time).subscribe(val => {
console.log(val);
this.stopidleTimer();
//this.appComponent.logout();
this.logout();
});
}
stopidleTimer() {
this.idle.stop();
}
closeidleTimeOutPopup() {
//console.log('closing popups');
this.idleTimeOutdialogRef.close();
}
logout() {
this.stopidleTimer();
if(this.activityTimerSubscription){
this.activityTimerSubscription.unsubscribe();
}
this.authService.logout();
}
}
Не уверен, почему this.idleTimeOutdialogRef.componentInstance.countMinutes выдает ошибку после того, как счетчик переходит с 60 на 58. Что мне здесь не хватает. Любые выводы будут очень признательны.