ウェブサイト検索

javascript - Injectable クラスがインスタンス化されたときに ngOnInit が呼び出されない


なぜ Injectable クラスが解決されても 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()

回答 #1

ライフサイクルフックは、OnInit() のようにディレクティブやコンポーネントで動作します。あなたの場合のようなサービスのような他のタイプでは動作しません。ドキュメントから:

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

ディレクティブおよびコンポーネントのインスタンスには、Angular がそれらを作成、更新、破棄する際のライフサイクルがあります。

回答 #2

すべてのライフサイクルフックについてはわかりませんが、破棄について言えば、ngOnDestroy は、プロバイダーが破棄されるとき(例えば、コンポーネントによって提供される Injectable の場合)に実際に呼び出されます。

ドキュメントから:

ディレクティブ、パイプ、またはサービスが破棄されるときに呼び出されるライフサイクルフック。

もし誰かが破壊に興味がある場合に備えて、この質問をチェックしてください:

回答 #3

@Sasxaによる回答に追加して、

「Injectables」では、ngOnInit() を使う代わりに constructor に初期コードを入れるという形で、class を通常通り使用することができますが、問題なく動作します。

関連記事