Angular中的会话超时警告弹出窗口

Sam*_*Sam 5 javascript angular

我正在处理30分钟不活动后会话超时的应用程序。我有一个新的要求,即弹出一条消息,询问用户是否要保持会话活动状态,这需要几分钟,然后用户才能自动注销。

现在,我以一种非常非传统的方式来管理会议,我需要尝试使用已经存在的内容。应用模块使用了一项服务context.service(称为提供程序)使用了一项服务,该服务使用setTimeout来确定30分钟的不活动时间已到期。

鉴于我需要访问该倒计时,因此我想创建一个镜像超时,该超时将提前2分钟执行并触发模式,询问用户是否要保持会话打开。注入I 后NgbModal,ContextService我收到一个循环参考错误,这似乎很合理。尝试使用提供程序在DOM上填充模式似乎有点疯狂,但是我不确定什么是可行的选择。

这是当前状态(存在循环参考错误):

// ...
import { SessionExpirationWarning } from '../components/session-expiration-warning/session-expiration-warning.component';
// ....

constructor(
    private _http: HttpClient,
    private _injector: Injector,
    private modalSvc: NgbModal
) {
    // ...
}

// ...

setSessionTimeout() {
    if (this.appConfig === null) { return; }

    clearTimeout(this._timeoutId);
    clearTimeout(this.timeoutWarning);

    const sessionTimeOutConfig = this.appConfig.SessionTimeoutMinutes;

    const SessionTimeoutMinutes = sessionTimeOutConfig === undefined ? 5 : sessionTimeOutConfig;
    const sessionWarningMinutes = 2;

    this._timeoutId = setTimeout(() => {
        this.sessionExpired();
    }, SessionTimeoutMinutes * (60 * 1000));

    this.timeoutWarning = setTimeout(() => {
        if (!this.warningIsActive) {
            const timeOutWarningModal = this.modalSvc.open(SessionExpirationWarning);

            timeOutWarningModal.result.then((modalResponse) => {
                if (modalResponse === true) {
                    this.keepAlive(null);
                }
            });
        }
    }, sessionWarningMinutes * (60 * 1000));
}
Run Code Online (Sandbox Code Playgroud)

这this.timeoutWarning是我尝试破解一个解决方案的尝试。

fjc*_*fjc 8

您可以做的是Observable在显示警告弹出窗口时发出:

import { timer } from 'rxjs/observable/timer';
// ...
public sessionWarningTimer$ = new Subject();
// ...
setSessionTimeout() {
    // ...
    timer(sessionWarningMinutes * 60 * 1000).subscribe(this.sessionWarningTimer$);
}
Run Code Online (Sandbox Code Playgroud)

AppComponent然后,您可以在组件(例如your )中订阅sessionWarningTimer$:

private destroyed$ = new Subject();

ngOnInit() {
    this
        .contextService
        .sessionWarningTimer$
        .takeUntil(this.destroyed$)
        .subscribe(() => this.displaySessionWarning());
}

ngOnDestroy() {
    this.destroyed$.next();
}

displaySessionWarning() {
    // your display code here
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以避免服务中的任何UI代码,而将重点放在警告逻辑上。