2016-11-24 14 views
0

イベントをトリガーするsetMessageメソッドと、このイベントをリッスンするすべてのコンポーネントの親コンポーネントであるMainComponentクラスを持つMessageServiceクラスがあります。イベントは火災になり、MainComponentはそれをキャッチし、すべてがOKです。 1つの問題があります。ユーザーがコンポーネントを変更したときなどに必要な情報:ダッシュボードコンポーネントからユーザーコンポーネントにナビゲートする。メッセージは自動的に破棄される。しかしここでこれは起こらず、メッセージは引き続きユーザーに表示されます。私は時間の後にメッセージを削除するようにタイマーを書いたが、私はこれか角2メッセージサービスの改善

これは私のメッセージサービスクラスで実装するためのより良い方法があるかどうかを知りたい:

import {ReplaySubject} from 'rxjs/ReplaySubject'; 

export class MessageService{ 

public messageSource; 
public messageEvent; 


constructor(){ 
    this.messageSource = new ReplaySubject(1); 
    this.messageEvent = this.messageSource.asObservable(); 
} 


public setMessage(message){ 
    this.messageSource.next(message); 
    window.setTimeout(()=>{ 
     this.destruct(); 
    },5000); 
} 

public destruct(){ 
    this.messageSource.next(null); 
} 

をし、これが私のメインでありますコンポーネントクラス:

export class MainComponent extends BaseComponent{ 


constructor(public router:Router,public authService:AuthService,public messageService:MessageService){ 
    super(router); 
    this.messageService.messageEvent.subscribe(msg => { 
     this.message = msg; 
    }); 

} 



public logout(){ 
    this.authService.removeToken(); 
    this.permission.user = null; 
    this.router.navigate(['/']); 
} 

} 
+1

あなたはより詳細な情報を与えることができますtypescriptです – Walfrat

+0

ためのJavaScriptのタグを切り替えるshoudl? –

答えて

0

コンポーネントのngOnDestroyライフサイクルフック内のメッセージの削除をトリガーします。コンポーネントが破棄されると起動します。

@Component({selector: 'my-cmp', template: `...`}) 
class MyComponent implements OnDestroy { 
    ngOnDestroy() { 
    // your code will go here 
    } 
} 

もっとここで読む:https://angular.io/docs/ts/latest/api/core/index/OnDestroy-class.html

+0

私はこれを試しましたが、主なコンポーネントは親コンポーネントだから、ngDestroyはそれを呼び出さないでしょう。ですから、このように、私は今実装されている方法がこれよりはるかに優れていると思うすべてのコンポーネントでこの関数を呼び出す必要があります。 –