簡體   English   中英

Angular2可觀察的范圍問題

[英]Angular2 Observable scoping issues

我以為我了解javascript范圍定義,但我想我必須離開某個地方...

我創建了一個可觀察的對象(用於會話超時類型功能),該對象會遞減一個數字並每秒發出一次。 我可以同意這一點,並看到數據變化很大。 我的問題是,有時觀察者之外的事件會“重置”計時器; 但是,觀察者內部使用的值不反映此重置。

我原以為使用脂肪箭頭語法this將被保留,但顯然我是不正確的地方。

可觀察對象是在構造函數中創建的,該構造函數作為單例注入到模塊中。

@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);
  }    
}

在此示例中,“觀察者中的計時器”的效果很好,從3000開始並每秒倒數。 但是,“復位定時器”始終未定義。 這使我倍加困惑,因為在最奇怪的情況下,由於我在Observable之外的構造函數中分配了它,因此它只是一個常數3000。

在本示例中,如何確保自己始終處於同一范圍內?

哈哈,按照正常情況,在發布問題后幾分鍾內,我就解決了。 原來我確實正確理解了粗箭頭的作用域,只是沒有在文檔偵聽器上使用它。

改變中

document.onkeypress = this.resetTimer;

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

使一切正常!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM