2016-01-31 11 views
90

Injectableクラスが解決されたときにngOnInit()が呼び出されないのはなぜですか?注入可能クラスがインスタンス化されたときにngOnInitが呼び出されない

コード

import {Injectable, OnInit} from 'angular2/core'; 
import { RestApiService, RestRequest } from './rest-api.service'; 

@Injectable() 
export class MovieDbService implements OnInit { 

    constructor(private _movieDbRest: RestApiService){ 
     window.console.log('FROM constructor()'); 
    } 

    ngOnInit() { 
     window.console.log('FROM ngOnInit()'); 
    } 

} 

コンソール出力

FROM constructor() 

答えて

157

Lifecycle hooks、指令およびコンポーネントとのOnInit()仕事のように。彼らはあなたの場合のサービスのように、他のタイプでは動作しません。 docs:

コンポーネントのライフサイクルは、Angular自体で管理されています。 Angularはそれを作成し、レンダリングし、子を作成してレンダリングし、データバインドされたプロパティが変更されたときにチェックし、DOMから削除する前に破棄します。

ディレクティブとコンポーネントのインスタンスには、作成、更新、破棄のライフサイクルがあります。

+16

私の 'ngOnInit'ロジックを' Injectable'クラスのコンストラクタに移動するだけですか?私はちょうど何らかの理由でコンストラクタからロジックを取り除くべきであるということを読んで思い出しました。 –

+25

@LeviFullerさて、サービスの場合、コンストラクタで初期化を行うことができます。あるいは、initメソッドを作成してコンストラクタから呼び出すこともできます(後でサービスをリセットする必要がある場合など)。 – Sasxa

+0

パーフェクト。ありがとう。なぜなら、Componentは初めてインスタンス化されるだけなので、コンストラクタは最初に呼び出され、ngOnInitはコンポーネントがレンダリングされるたびに呼び出されるからです。それは正しいようですか? –

18

私はすべてのライフサイクルフックについてはわかりませんが、破棄に関しては、プロバイダが破棄されたときにngOnDestroyが実際に呼び出されるようになりました(たとえば、コンポーネントによって提供される注入物)。

ライフサイクルフック指令、パイプ又はサービスが破棄されるときに呼び出される:ドキュメント(https://angular.io/docs/ts/latest/api/core/index/OnDestroy-class.html)から

誰もがこの問題のような破壊に興味がある念のために:サービスのためのLife-cycle methods for services in angular2

-1

ライフサイクルメソッドがすでに他の人によって覆われて、私は一般的

におけるライフサイクル・メソッドについての私の考え方を共有しています

角度4点のライフサイクルメソッド

ngOnInit()ngOnChanges()およびngOnDestroy()などはライフサイクルの方法です。 ngOnChanges()が最初に呼び出され、ngOnInit()の前にバインドされたプロパティの値が変更された場合、変更がなければ呼び出されません。 ngOnDestroy()は、コンポーネントが削除されたときに呼び出されます。それを使用するには、OnDestroyがクラスによってimplementである必要があります。

関連する問題