实现OnInit类的目的是什么,删除ngOnInit可以正常工作吗?

时间:2018-09-26 07:03:29

标签: angular oop angular6 interface-implementation

在角度6中,当我们创建组件时,该组件的.ts文件具有实现OnInit类的类,但是当我们删除默认方法(ngOnInit)时,它可以正常工作。 所以我的问题是,如果它实现了某个类,那么它必须具有某种必须在此实现的类中实现的方法,如果不需要具有方法,那么实现OnInit类的目的是什么。

4 个答案:

答案 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引导程序的第二阶段:

  1. 组件树的构建
  2. 更改检测

这是一个好习惯(有时需要),使用OnInit钩子而不是在构造函数内部(而是必须用于DI)初始化组件,这主要是因为构造函数调用是'Angular组件的一部分树结构”,然后输入绑定将在构造函数内部不可用(因为它们是the detection change phase的一部分。

答案 3 :(得分:0)

  

这是一个好习惯

我看到很多东西,但是实际上,有人可以向我解释为什么如果ngOnInit函数为空,为什么必须实现此接口?在需要时添加它是一件坏事吗?