2016-12-02 9 views
0

私はangular2アプリケーションで作業しています。私は事前に設定された時間の期間に実行されるスケジューラの要件があります。角度2 RxJSタイマが動作しているかどうかを検出します。

1:HomeComponent、 2:MasterComponent

は、私は自分のアプリケーションでは、主に2成分を持ちます。

私のマスターコンポーネントは常にブラウザにあり、他のすべてのコンポーネントはそのコンポーネントです。私はHomeComponentに行くとき

は今、私は今..

ngOnInit()RxJS timer追加した、MasterComponentは、私は今..範囲外であると私は(すでに最初に働いている)他の回を開始しMasterComponnentするために戻ってきたとき2タイマーあります。

何時でも実行されているかどうかを検出したい場合は、起動しないでください。 。

私は場合にのみ、ユーザーがログインする時間を開始する必要があり

マスターコンポーネントコード:ngOnInitに私はすべてのタイマーがまだ実行されてかを検出できるよう

ngOnInit() { 
    let timer = Observable.timer(2000, 1000); 
    timer.subscribe(this.printConsole); 
} 

printConsole() { 
    console.log("ticks: " + new Date()); 
} 

がとにかくそこにあります!

+0

は、静的変数を作成します。 'MasterComponent'が常に画面に表示されていると言うと、' ngOnInit'を2回起動することはできますか? – PierreDuc

+0

私は、HomeComponentのロード時にMasterComponentが消えたときに、主に2つのコンポーネントを持っていました。そのため、2回ロードされます。 –

答えて

1

があなたのMasterComponentに静的変数を作成します。

export class MasterComponent { 

    public static TIMER; 

    ngOnInit() { 
     if(!MasterComponent.TIMER) { 
     MasterComponent.TIMER = Observable.timer(2000, 1000);  
     } 
    } 
} 

別のオプションを、これは私の個人的な好みを持って、アプリケーション内のシングルトンサービスを作成し、そのサービスは、タイマーを作成できるようにすることができます。その後、このサービスをMasterComponentに注入し、タイマーに登録します。たとえば:

export class MasterTimer { 

    public get timer() { 
     return this._timer; 
    } 

    private _timer; 

    constructor() {} 

    public initTimer(): void { 
     if(!this._timer) { 
     this._timer = Observable.timer(2000, 1000); 
     } 
    } 
} 

あなたMasterComponentはこれに変更されます。

export class MasterComponent { 

    private _timerSub: Subscription; 

    constructor(private _masterTimer: MasterTimer){} 

    ngOnInit() { 
     this._masterTimer.initTimer(); 
     this._timerSub = this._masterTimer.timer.subscribe(this.printConsole); 
    } 

    ngOnDestroy() { 
     this._timerSub.unsubscribe(); 
    } 
} 
+0

こんにちは、別のサービスや子コンポーネントで '_TIMER'にアクセスできましたか?ユーザーのログイン時にタイマーを開始し、ログアウト時に破棄したいので、何か方法はありますか? –

+0

公開すると可能です。しかし、複数のコンポーネント間でアクセス可能なものを作成したい場合は、 – PierreDuc

+0

というサービスを作成し、ログインサービスからスケジューラを開始したいと思っていて、出来ますか ? –

関連する問題