2017-01-29 8 views
1

私は、ログインが完了したら、別のページにルーティングする、非常に単純で直感的な振る舞いであると思うものを実装しようとしています。しかし、一部のデータはコンポーネントの1つで更新されていないため、Angular 2の変更検出と関係があると思われます。角2 +角膜炎2ログイン - 変化を検出しない

これは私のコードです:

ログインコンポーネント - ページモジュールの一部

constructor(private _af: AngularFire, 
      private _router: Router, 
      private _zone: NgZone) { 
} 

onLoginSubmit() { 
    this._af.auth.login({ 
     email: this.auth.email, 
     password: this.auth.pass 
    }).then(success => { 
     this._zone.run(() => { 
      this._router.navigate(['/']); 
     }); 
    }) 
} 

ダッシュボードコンポーネント - ページモジュールの一部 - ルート '/'

ngOnInit() { 
    this._stateService.currentPageName = 'Dashboard'; 
} 

Topbarコンポーネント - UIモジュールの一部

ngOnInit() { 
    this._router.events.subscribe(() => { 
     this.pageName = this._stateService.currentPageName; 
    }); 
} 

Topbarテンプレート

<!-- This is not updated when I'm routing from the login page, 
      but it shows fine when I'm reloading the page or switching to any other routes --> 
     <a class="navbar-brand">{{ pageName }}</a> 
+0

この種の状況に対処する必要があります。これは、初期化時に利用できる変更だけでなく、後で発生する変更を検出するためです。 – Muirik

+0

'ngOnChanges(){ this.pageName = this._stateService.currentPageName;を追加しようとしました。 } ' をトップバーコンポーネントに追加しても、何も起こりません。これは正しい場所ですか? –

+0

また、ngOnChangesライフサイクルフックは、アプリケーション全体の値ではなく、入力値の変化に反応します。 –

答えて

2

私はあなたがcurrentPageNameを設定する前に、あなたのrouter.eventsが発射されていることを推測します。

簡単で簡単な解決策:stringの代わりにStateServiceの中にBehaviorSubjectを使用します。あなたのTopbarテンプレートの内部で直接このBehaviorSubjectを使用

ngOnInit() { 
    this._stateService.currentPageName.next('Dashboard'); 
    // or create a function inside of your service 
    // this._stateService.setCurrentPage('Dashboard'); 
} 

currentPageName = new BehaviorSubject<string>(''); 

新しいあなたDashboard部品の内部値を設定

<a class="navbar-brand">{{ _stateService.currentPageName | async }}</a> 
あなたが角度のngOnChanges()のライフサイクルフックを使用することができ
+0

これは実際問題でした。イベントはあまりにも早すぎるのではなく遅すぎます。しかし、ルート名用の新しいコンポーネントを作成し、ngOnChangesにフックして値を表示することにしました。それがトリックでした。 あなたのソリューションはうまくいくように聞こえますが、BehaviorSubjectが通常のSubjectと比較して何を説明できますか? ありがとうございました! –

+0

'BehaviorSubject'のトリックは、最後の値を保持するということです。 '.value'を介してアクセスできます。 「通常」の「Subject」では、値が変更された場合にのみトリガされます。あなたのテンプレートは、購読中に変更された場合にのみ値を表示することができます。その 'BehaviorSubject'のProでは、あなたのテンプレートは常に値を表示します! :) – mxii

+0

恐ろしい、ありがとう! –

関連する問題