解决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()
答案 0 :(得分:250)
Lifecycle hooks,与OnInit()
一起使用指令和组件。它们不适用于其他类型,例如您的服务中的服务。来自docs:
组件具有由Angular本身管理的生命周期。 Angular创建它,渲染它,创建和渲染它的子节点,在数据绑定属性发生变化时对其进行检查并在将其从DOM中删除之前对其进行破坏。
指令和组件实例具有生命周期,因为Angular会创建,更新和销毁它们。
答案 1 :(得分:39)
我不知道所有生命周期钩子,但是对于破坏,ngOnDestroy
实际上在它的提供者被销毁时被注入Injectable(例如,由组件提供的Injectable)。
来自docs :
销毁指令,管道或服务时调用的生命周期钩子。
万一有人对销毁感兴趣,请检查this问题:
答案 2 :(得分:3)
注意:此答案仅适用于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");
}
}
答案 3 :(得分:3)
我的dataService初始化后,我不得不调用一个函数,而是在对我有用的构造函数内部调用了它。
答案 4 :(得分:1)
添加到@Sasxa 的回答,
在 Injectables
中,您可以正常使用 class
,将初始代码放入 constructor
而不是使用 ngOnInit()
,它工作正常。
答案 5 :(得分:0)
在服务中,您可以将resolvers
用于相同的目的,如本文中所述:https://codeburst.io/understanding-resolvers-in-angular-736e9db71267
要了解解析器的用法,让我们看看流程是如何发生的, 当有人点击链接时。
常规路由流程。
使用解析器路由流
用户单击链接。
Angular执行某些代码并返回一个值或可观察的值。
您可以在即将加载的组件的类中,在构造函数或ngOnInit中收集返回值或可观察到的值。
将收集的数据用于您的目的。
现在您可以加载组件。
第2步,第3步和第4步是使用称为解析器的代码完成的。
答案 6 :(得分:-1)
正如其他人所说,ngOnInit
仅适用于组件。
在Injectable()
服务中使用构造函数。在大多数情况下,它将满足您的需求。
答案 7 :(得分:-1)
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()
}