[英]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 創建、更新和銷毀它們時具有生命周期。
添加@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.