2017-07-28 3 views
1

セッションの有効期限の1分前にポップアップを表示するようにアイドルを設定すると問題が発生します。次に、セッションがタイムアウトするか、ユーザーがログアウトします。次回ユーザーがログオンすると、タイムアウトが発生したときに2つのポップアップが表示されます。ユーザーがログアウトしてからもう一度ログインすると、3つのポップアップなどが表示されます。ユーザーがログアウトするとIdleの現在のインスタンスを破壊するにはどうすればよいですか?次のようにログインが成功するたびにng2-idleインスタンス化を複数回実行する方法

私のセットアップは次のとおりです。

constructor(private idle: Idle, ...) {} 

ngOnInit() { 
    this.setIdle(); 
} 

private setIdle() { 
    // Client activity timeout. 29 minutes to 'idle', 1 minute beyond that to timeout 
    this.ngZone.runOutsideAngular(() => { 
     // this.idle.setIdle(29 * 60); 
     // this.idle.setTimeout(1 * 60); 
     this.idle.setIdle(10); 
     this.idle.setTimeout(10); 
     this.idle.setInterrupts(DEFAULT_INTERRUPTSOURCES); 
    }); 


    this.idle.onTimeout.subscribe(() => { 
     this.ngZone.run(() => { 
      this.errorDialogRef.close(); 
      sessionStorage.setItem('sessionExpired', 'true'); 
      this.displayErrorModal(true); 
     }); 

    }); 

    this.idle.onIdleStart.subscribe(() => { 
     this.ngZone.run(() => { 
      this.displayIdleWarning(); 
     }); 
    }); 

    this.ngZone.runOutsideAngular(() => { 
     this.idle.watch(); 
    }); 
} 

ログアウト処理中に、私はthis.idle.stop()delete this.idleを試してみました。しかし、どちらもうまくいった。

FYI:それは角度ゾーンの外で走らなければならない、さもなければ我々の分度器テストが中断する。

アップデート: 私は配列をゼロの解決策を見つけるまで、私がしようとしました:

this.idle.onTimeout.unsubscribe(); 
this.idle.onIdleStart.unsubscribe(); 
this.idle.onIdleEnd.unsubscribe(); 

しかし、唯一以降のログイン時に次のエラーが生じていること:

core.es5.js?0445:1084 ERROR Error: Uncaught (in promise): ObjectUnsubscribedError: object unsubscribed 

それ私のコンポーネントがその参照を保持しているか、ログアウト中に破壊されていないようです。

答えて

2

私はthis.idleオブジェクトを検査することができましたし、「やるもの」オブジェクト(onTimeoutonIdleStartonIdleEndonInterrupt、およびonTimeoutWarning)が持つEventEmitterたことを発見しました。それぞれにはobserversというオブジェクトがありました。 observersはObserverの配列です。新しいポップアップが作成されるたびに、配列が増加していることに気付きました。ログアウト処理中にオブザーバーをクリアしただけです。

this.idle.stop(); 
this.idle.onTimeout.observers.length = 0; 
this.idle.onIdleStart.observers.length = 0; 
this.idle.onIdleEnd.observers.length = 0; 

これは最適ではない可能性があります。私はEventEmitterからObserverを削除するより良い方法があると確信しています。しかし、私はそれを見つけることができませんでした、そして、これは迅速かつ汚れた方法でした。

+0

これは実際に機能します!私の一日を本当にありがとうございました。 – shreya

関連する問題