簡體   English   中英

實例化 Injectable class 時未調用 ngOnInit

[英]ngOnInit not being called when Injectable class is Instantiated

為什么在解析Injectable class 時不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()');
    }

}

控制台 Output

FROM constructor()

生命周期鈎子,如OnInit()與指令和組件一起使用。 它們不適用於其他類型,例如您的服務。 來自文檔:

組件的生命周期由 Angular 自己管理。 Angular 創建它,渲染它,創建和渲染它的子節點,當它的數據綁定屬性發生變化時檢查它,並在從 DOM 中刪除它之前銷毀它。

指令和組件實例在 Angular 創建、更新和銷毀它們時具有生命周期。

我不知道所有的生命周期鈎子,但至於銷毀, ngOnDestroy實際上在 Injectable 的提供者被銷毀時被調用(例如由組件提供的 Injectable)。

docs :

當指令、管道或服務被銷毀時調用的生命周期鈎子。

以防萬一有人對破壞感興趣,請檢查以下問題:

添加@Sasxa 的回答

Injectables中,您可以正常使用將初始代碼放入constructor中的class ,而不是使用ngOnInit() ,它工作正常。

一旦我的 dataService 被初始化,我必須調用一個函數,相反,我在構造函數中調用它,這對我有用。

注意:此答案僅適用於 Angular 組件和指令,不適用於服務。

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");
    }
}

我們可以通過將它放在構造函數中來觸發它。 但是 ngOnInit() 沒有觸發的原因是什么。

在您的服務中,您可以將resolvers用於相同的目的,如本博文所述: https : //codeburst.io/understanding-resolvers-in-angular-736e9db71267

為了了解解析器的用法,讓我們看看當有人單擊鏈接時流程如何發生。

常規路由流程。

  • 用戶單擊鏈接。
  • 角加載相應的組件。

使用解析器的路由流

  • 用戶單擊鏈接。

  • Angular執行某些代碼並返回一個值或可觀察值。

  • 您可以在要加載的組件類中的構造函數或ngOnInit中收集返回值或可觀察的值。

  • 將收集的數據用於您的目的。

  • 現在您可以加載您的組件了。

步驟2、3和4是使用稱為Resolver的代碼完成的。

正如其他人所說, ngOnInit僅在組件上起作用。

Injectable()服務中使用構造函數。 在大多數情況下,它將滿足您的需求。

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


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM