在角度6中,当我们创建组件时,该组件的.ts文件具有实现OnInit类的类,但是当我们删除默认方法(ngOnInit)时,它可以正常工作。 所以我的问题是,如果它实现了某个类,那么它必须具有某种必须在此实现的类中实现的方法,如果不需要具有方法,那么实现OnInit类的目的是什么。
答案 0 :(得分:1)
ngOnInit
是Angular调用的生命周期挂钩,表示Angular已完成组件的创建。
我们导入OnInit
以便使用它,实施OnInit
不是强制性的,但被认为是一种好习惯):
import {Component, OnInit} from '@angular/core';
创建组件后,我们使用ngOnInit进行操作。例如,您可以在此处设置变量,调用方法等。
https://angular.io/api/core/OnInit
如果导入OnInit
并执行export class AppComponent implements OnInit
,则必须添加ngOnInit()
方法,否则会出现编译错误
答案 1 :(得分:0)
OnInit不是类,而是框架提供的接口,因此,如果您想在初始化组件时执行某些操作,则可以在类中提供ngOnInit()方法,并将代码保存在该类中。有关ngOnInt的更多信息:https://angular.io/api/core/OnInit
如果您已实现OnInit接口,但未提供ngOnInit,则在VSCode或其他一些编辑器抛出的代码中,您将得到编译错误。
如下所示:
类'ClaimComponent'错误地实现了接口'OnInit'。 类型'GiftingClaimComponent'中缺少属性'ngOnInit'。
但是,由于最终将TS代码编译为JavaScript,它将运行良好。
并且由于JavaScript没有类型安全性或我们在TypeScript中获得的接口密闭性。但是,如果您尝试创建应用程序的AOT构建,它将失败,您将必须提供实现。
答案 2 :(得分:0)
正如@Patricio Vargas所说,如果您导出实现OnInit
接口的类组件,则需要实现ngOnInit()
方法,否则会得到错误TS2420
(您当然可以尝试on stackblitz,只需在为Angular项目提供的默认AppComponent内实现OnInit接口即可。
关于第二点,即实现该接口的目的,您应牢记Angular引导程序的第二阶段:
这是一个好习惯(有时需要),使用OnInit
钩子而不是在构造函数内部(而是必须用于DI)初始化组件,这主要是因为构造函数调用是'Angular组件的一部分树结构”,然后输入绑定将在构造函数内部不可用(因为它们是the detection change phase的一部分。
答案 3 :(得分:0)
这是一个好习惯
我看到很多东西,但是实际上,有人可以向我解释为什么如果ngOnInit
函数为空,为什么必须实现此接口?在需要时添加它是一件坏事吗?