2017-01-13 16 views
0

を発行し、私は私が数をデクリメントし、各秒を放出する(セッションタイムアウトタイプの機能のために)、観察を作成Angular2観察可能スコープは

...私はJavaScriptをスコープが、私は、私はどこかでなければならないと思ってい理解と思いました。私はこの罰金に加入し、データが大きく変化するのを見ることができます。私の問題は、Observer以外のイベントがタイマーを「リセット」することがあることです。ただし、オブザーバ内で使用される値は、このリセットを反映しません。

太い矢印の構文を使用すると、thisが保存されると思いましたが、明らかにどこかに間違っています。

observableは、シングルトンとしてモジュールに注入されるコンストラクタで作成されます。

@Injectable() 
export class TimeoutService { 

    private _internalTimer: number;  
    private _logoutThreshold: number; 
    private _timer$: Observable<number>; 

    constructor(@Inject(DOCUMENT) private document: any) { 

    this._logoutThreshold = 3000; 

    document.onkeypress = this.resetTimer; 

    this._internalTimer = this._logoutThreshold;  

    this._timer$ = new Observable(observer => { 

     observer.next(this._internalTimer) 

     setInterval(() => { 
     this._internalTimer--; 
     console.log("timer in observer", this._internalTimer); 
     observer.next(this._internalTimer); 
     }, 1000); 

    }); 
    } 

    resetTimer() { 
    this._internalTimer = this._logoutThreshold; 
    console.log("timer in reset", this._internalTimer); 
    }  
} 

この例では、「timer in observer」は3000で始まり1秒ごとにカウントダウンします。ただし、「リセット中のタイマー」は常に定義されていません。これはObservable以外のコンストラクタに割り当てられているので、私はそれがちょうど3000であると思うと思うので、これは二重に混乱しています。

この例では、常に同じスコープになっていますか?

答えて

1

ハアと質問を投稿した分以内に通常通り、私はそれを解決しました。私は太い矢印の範囲を正しく理解していましたが、ドキュメントリスナーでは使用していませんでした。

document.onkeypress = e => this.resetTimer(); 

document.onkeypress = this.resetTimer; 

を変更

は、すべてが完璧に動作します!