2

私は現在、Angular 2で利用可能な新しいRouter 3.0 alphaで遊んでいる小さなPlunkを持っています。問題は、特定のIDを持つ '詳細'コンポーネントにルーティングするリンクをクリックすると、別のIDを持つ別のリンクをクリックすると変更されないということです。コンポーネントは再インスタンス化されることはありません。したがって、コンポーネントが初めてロードされたときに渡された内容が示されます。Angular2コンポーネントがルーティングパラメータのアップデートを検出しない(ルータ3.0)

import { Component, OnInit } from '@angular/core'; 
import { ActivatedRoute } from '@angular/router'; 
import { ContactsService } from './contacts.service'; 

@Component({ 
    selector: 'contacts-detail', 
    template: ` 
    <h2>{{contact.name}}</h2> 
    ` 
}) 
export class ContactsDetailComponent implements OnInit { 

    constructor(private contactsService: ContactsService, private route: ActivatedRoute) { 
    } 

    ngOnInit() { 
    this.contact = this.contactsService.getContact(this.route.snapshot.params.id); 
    console.log('Fetching user', this.route.snapshot.params.id); 
    } 
} 

Here is the Plunk問題を実証:

は、ここで問題になっているコンポーネントです。 1つの著者名をクリックし、次に別の名前をクリックして変更しないようにします。あなたのContactsDetailComponent

答えて

8

、これにOnInitを変更します。

ngOnInit() { 
    this.sub = this.route.params.subscribe(params => { 
    let id = +params['id']; 
    this.contact = this.contactsService.getContact(id); 
    }); 
    } 

があなたのPlunkに私のために働きました。

+0

それは確かに私のために働くが、それは奇妙に見える。しかし、他に何も来なければ、私はこれで行くつもりです。答えに時間をとってくれてありがとう。 –

+0

それは奇妙ではなく、コンポーネントの再利用です。 – TDaver

+0

@TDaver言葉の選択を変更してみましょう。まったく明らかではありません。私はngOnReloadインターフェイスのようなものを探しましたが、何も見つかりませんでした。それは、実行する必要があることを行うAngular2の魅力的な方法のように思えます。 –

1

これに使用できる複数のlifeCycleフックがあるようです。 DoCheckインターフェイスを使用し、コンポーネントクラスでngDoCheck()メソッドを実装することで、以下のように目的の動作を得ることができました。

import { Component, DoCheck } from '@angular/core'; 
import { ActivatedRoute } from '@angular/router'; 
import { ContactsService } from './contacts.service'; 

@Component({ 
    selector: 'contacts-detail', 
    template: ` 
    <h2>{{contact.name}}</h2> 
    ` 
}) 
export class ContactsDetailComponent implements AfterViewChecked, DoCheck { 

    constructor(private contactsService: ContactsService, private route: ActivatedRoute) { 
    } 

    ngDoCheck() { 
    this.contact = this.contactsService.getContact(this.route.snapshot.params.id); 
    } 
} 

Here's a plunk更新コードです。

私はこのライフサイクルフックが最高で正しいとは確信していません。おそらく、このより良いサービスを提供するRouterから利用可能なフックがあります。

+0

これは興味深いアプローチです(明らかに機能します)。ドキュメントのほんの少しから 'DoCheck'がありますが、それはディレクティブで使用されるように思われます。スナップショットからオブザーバブルまでのパラメータ値を取得する利点があるかどうかは何ですか? –

+0

@ R.リチャード私はこれが正しいことはまったくわかりません。私は入力フィールドのすべてのキーストロークで '@ Input'変数と' ngDoCheck() 'メソッドに接続されたコンポーネントのフォームフィールドを使ってテストを行いました。これは明らかに私たちが望むものではありません。ちょっとしたことがあるような気がしますが、新しいルータがあなたの答えのようにこのタイプの状況を処理することを期待しているという記事(公式ではない)が出てきました。 –

+1

うわー。ありがとうございます@マイケルオーリル!コーヒーを買ってみたい。私は、自分の値の1つが変わったときに、そして私がほぼ完全にやめてしまった数多くの試みの後に、自分のコンポーネントの1つをリフレッシュしようとしていました。私は提案したようにngDoCheck()メソッドを実装しようとしましたが、今はうまくいきます。ビオラ。数時間の不満が終わりました。 – b0rgBart3

0

これ行う別の方法:ここで

ngOnInit() { 
    this.route.params.forEach((params: Params) => { 
     let id = +params['id']; 
     this.contact = this.contactsService.getContact(id); 
    }); 
} 

は観測から、ルートのparamsを取得します。 Observable over Snapshotを使用する利点は、コンポーネントを再度インスタンス化せずにコンポーネントを再利用することです。これは、Angular 2.0の最終的なドキュメントに従ってこれを行う推奨された方法です。

関連する問題