[javascript] Injectable 클래스가 인스턴스화 될 때 ngOnInit가 호출되지 않음

클래스가 해결 ngOnInit()될 때 왜 호출 되지 Injectable않습니까?

암호

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()



답변

OnInit()지시문 및 구성 요소 작업과 같은 라이프 사이클 후크 귀하의 경우 서비스와 같은 다른 유형에서는 작동하지 않습니다. 문서에서 :

구성 요소에는 Angular 자체에서 관리하는 수명주기가 있습니다. Angular는 그것을 생성하고, 렌더링하고, 자식을 생성하고 렌더링하며, 데이터 바인딩 된 속성이 변경 될 때이를 확인하고 DOM에서 제거하기 전에이를 제거합니다.

지시문 및 구성 요소 인스턴스는 Angular가 인스턴스를 생성, 업데이트 및 파괴 할 때 수명주기를 갖습니다.


답변

모든 수명주기 후크에 대해 잘 모르지만 파괴와 관련하여 ngOnDestroy공급자가 파괴 될 때 실제로 Injectable에서 호출됩니다 (예 : 구성 요소에서 제공하는 Injectable).

로부터 docs :

지시문, 파이프 또는 서비스 가 파괴 될 때 호출되는 수명주기 후크 .

파괴에 관심이있는 사람 있다면 질문을 확인 하십시오 .


답변

참고 :이 답변은 서비스가 아닌 각도 구성 요소 및 지시문에만 적용됩니다.

ngOnInit구성 요소에 대해 (및 다른 수명주기 후크) 실행되지 않았을 때도 동일한 문제가 발생 했으며 대부분의 검색으로 인해 여기로 이끌었습니다.

문제는 =>다음과 같이 화살표 함수 구문 ( )을 사용하고 있다는 것입니다 .

class MyComponent implements OnInit {
    // Bad: do not use arrow function
    public ngOnInit = () => {
        console.log("ngOnInit");
    }
}

분명히 Angular 6에서는 작동하지 않습니다. 화살표가 아닌 함수 구문을 사용하면 문제가 해결됩니다.

class MyComponent implements OnInit {
    public ngOnInit() {
        console.log("ngOnInit");
    }
}


답변

내 dataService가 초기화되면 함수를 호출해야했습니다. 대신 생성자 내부에서 호출하여 나를 위해 일했습니다.


답변

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

@Injectable()
export class MovieDbService implements OnInit {

userId:number=null;

constructor(private _movieDbRest: RestApiService,
            private instanceMyService : Service ){

   // do evreything like OnInit just on services

   this._movieDbRest.callAnyMethod();

   this.userId = this.instanceMyService.getUserId()


}


답변