2016-11-07 9 views
2

角度2.1.0、ルータ3.1.0。角度2.1 - ルーティング中のコンポーネントの再作成

ダッシュボードコンポーネントを作成しているうちに、ルーティングするたびに最初から作成されていることに気づきました。それから、私はHerosデモプランナーのTourをチェックしました - 同じ振る舞いです。 DashboardComponent

export class DashboardComponent implements OnInit { 
    heroes: Hero[] = []; 

    constructor(private heroService: HeroService) { 
    console.log('DashboardComponent constructor') 
    } 

    ngOnInit(): void { 
    this.heroService.getHeroes() 
     .then(heroes => this.heroes = heroes.slice(1, 5)); 
    console.log('DashboardComponent ngOnInit') 
    } 
} 

変更は、ここでplunkerです。開発者コンソールを開きます。プランナーを実行してください - DashboardComponent constructorDashboardComponent ngOnInitの2つのログが表示されます。 HeroesをクリックしてDashboardに戻ってください - 再び2ログ:ngOnInitを構築して呼び出してください。

Plunkerは古いライブラリを使用することがあります。私はJohn Papa gitからTOHをクローン作成しました(彼はAngularとrouterの同じバージョンを使用しています)。コンソールログはDashboardComponentに変更しました。結果 - 同じ。

ngOnDestroyDashboardComponentを追加しました。これはダッシュボードを離れるときに呼び出されます。それはデザインの振る舞いに似ています。メリットは何ですか?すでに作成されたコンポーネントを再利用するにはどうすればよいですか?

答えて

2

> = 2.3.0-rc.0

RouteReuseStrategyのルーティングコンポーネントが破壊され、再作成または再使用されるときに制御するために実装することができるカスタム。

これは、 "設計どおり" です。コンポーネントはルートから遠ざかるときに破壊され、ルートに戻ったときに再作成されます。

コンポーネントは、ルートパラメータのみが変更されても、ルートは同じままであれば保持されます。

いくつかのカスタムキャッシュ戦略について議論しましたが、AFAIKはまだこの方向で何も行われていませんでした。

+0

この破棄/作成動作を防止する方法はありますか(ルートへの切り替えを追加するなど)ですか? – koral

+0

いいえ、現在、設定する方法はありません。私が見る唯一の方法は、カスタムルータアウトレットを作成し、コンポーネントをいつ再作成するかを気にすることです。より良い方法は、状態を親コンポーネントによって提供されるサービスに移動し、作成時にこの状態から再作成されたコンポーネントを更新することです。 –

+0

利点は、Angular2コードが簡単だということです。ルータは、いつコンポーネントをリリースできるかを知る必要があります。そのルートに戻ることはできないので、コンポーネントを保持するためにはどうしたらよいでしょうか? –

関連する問題