2016-03-07 8 views
68

コンポーネントが読み込まれるたびに関数xを実行したい場合は、最初のかどうかにかかわらず、別のサイトに移動して戻るか、コンポーネントが読み込まれたのは5回目です。角2コンポーネントコンストラクタとOnInit

function xを何に入れるべきですか?コンポーネントコンストラクタまたはOnInit?

答えて

70

コンストラクタはtypescriptですクラスの定義済みのデフォルトの方法です。 Angularとconstructorの間には関係がありません。通常、いくつかの変数を定義/初期化するのに、constructorを使用しますが、Angularのバインディングに関連するタスクがある場合、AngularのngOnInitライフサイクルフックに移動します。 ngOnInitは、コンストラクタ呼び出しの直後に呼び出されます。コンストラクタでも同じ作業を行うことができますが、Angularのバインディングを開始するにはngOnInitを使用することをお勧めします。我々はコアライブラリからこのフックをインポートする必要がngOnInitを使用するために

import {Component, OnInit} from '@angular/core' 

その後、我々は(これは、このインタフェースを実装するのに必須ではないが、一般的に、我々がやった)エクスポートしたクラスで、このインタフェースを実装しています。両方を使用しての

例:

export class App implements OnInit{ 
    constructor(){ 
    //called first time before the ngOnInit() 
    } 

    ngOnInit(){ 
    //called after the constructor and called after the first ngOnChanges() 
    } 
} 

詳細についてはまた Difference between Constructor and ngOnInit

+1

しかし、あなたは実際の質問に答えなかった。このケースではどちらを使うべきですか? –

+3

ngOnInitはコンストラクタ呼び出しの直後に呼び出されません。その間にngOnChangesがあります:https://angular.io/guide/lifecycle-hooks – Hazlo8

22

最初のもの(コンストラクタ)はクラスのインスタンス化に関連しており、Angular2とは関係ありません。つまり、どのクラスでもコンストラクタを使用できます。新しく作成されたインスタンスの初期化処理を行うことができます。

もう一つはAngular2コンポーネントのライフサイクルフックに対応する:入力または出力結合値が

  • ngOnInitを変更したとき

    • ngOnChangesが呼び出されるが、そこで最初ngOnChanges

    後に呼び出されます関数の初期化処理がコンポーネントのバインディングに依存している場合は、ngOnInitを使用する必要があります(たとえば、で定義されたコンポーネントパラメータ)、それ以外の場合はコンストラクタで十分です。

  • +0

    を参照してくださいコンストラクタ上 'ngOnInit'を使用することが悪いだろうどのような状況はありますか? – dman

    14

    constructor()new SomeClass()のために呼び出されます。コンストラクタは、クラス階層内のフィールドの初期化順序を適切にします。

    ngOnInitは、コンポーネントの作成が完了したとき、およびバインディングを評価して初めて入力を更新した後に、Angularによって呼び出されるライフサイクルメソッドです。

    も参照してくださいDifference between Constructor and ngOnInit

    +0

    あなたは100%正しいです、私はあなたのためにupvote。私の考えでは、 'ngOnInit'をReactの' componentDidMount'と記述すると、すべての混乱がなくなります。しかし、正直言って、開発者にとっては、呼び出されても初期化フレーズは1つだけ必要です。非常に古い方法では、クラスのような関数を使ってコンポーネントクラスを構築するので、インジェクションは引数として渡され、1つの '$ onInit'が必要です。 Ng2 +は美しい作品ではありません。 – stanleyxu2005

    +0

    コンストラクタは、特定の制限があるTypeScript言語機能です。 Angularがそれをアボートすることはできません。 –