当前位置: 首页 > 知识库问答 >
问题:

构造函数与ngOnInit的区别

童铭晨
2023-03-14

默认情况下,Angular提供生命周期钩子ngoninit

如果我们已经有构造函数,为什么要使用ngoninit

共有2个答案

仲柏
2023-03-14

本文从多角度探讨了构造函数与ngOnInit在Angular中的本质区别。这个答案提供了与组件初始化过程相关的最重要的差异解释,也显示了在用法上的不同。

角引导过程包括两个主要阶段:

  • 构造组件树
  • 运行更改检测

当Angular构造组件树时调用组件的构造函数。所有生命周期钩子都是作为运行变更检测的一部分调用的。

当Angular构造组件树时,根模块注入器已经配置好,因此您可以注入任何全局依赖关系。此外,当Angular实例化子组件类时,父组件的注入器也已经设置好,因此您可以注入父组件上定义的提供程序,包括父组件本身。组件构造函数是在注入器上下文中调用的唯一方法,因此如果需要任何依赖项,那是获取这些依赖项的唯一地方。

当Angular启动变化检测时,构建组件树,并调用树中所有组件的构造函数。此外,每个组件的模板节点都被添加到DOM中。@input通信机制是在更改检测期间处理的,因此您不能期望构造函数中有可用的属性。它将在ngoninit之后提供。

让我们来看一个简单的例子。假设您有以下模板:

<my-app>
   <child-comp [i]='prop'>

因此Angular开始引导应用程序。正如我所说的,它首先为每个组件创建类。因此它调用myappcomponent构造函数。它还创建了一个DOM节点,该节点是my-app组件的主机元素。然后继续为child-comp创建一个主机元素,并调用childComponent构造函数。在这个阶段,它并不真正关心i输入绑定和任何生命周期挂钩。因此,当这个过程完成时,Angular将以以下组件视图树结束:

MyAppView
  - MyApp component instance
  - my-app host element data
       ChildCompnentView
         - ChildComponent component instance
         - child-comp host element data  

然后才运行my-app的更改检测和更新绑定,并在MyAppComponent类上调用ngoninit。然后继续更新child-comp的绑定,并在ChildComponent类上调用ngoninit

根据需要,您可以在构造函数或ngoninit中执行初始化逻辑。例如,这里的文章是如何在计算@ViewChild查询之前获取ViewContainerRef,展示了需要在构造函数中执行何种类型的初始化逻辑。

以下是一些有助于您更好地理解主题的文章:

  • 您需要了解的关于Angular中的变化检测的所有信息
  • Angular的$Digest在Angular的更新版本中重生
  • Angular中属性绑定更新的机制
施越彬
2023-03-14

构造函数是类的默认方法,它在类实例化时执行,并确保类及其子类中字段的正确初始化。Angular或更好的依赖注入器(DI)分析构造函数参数,当它通过调用new MyClass()创建新实例时,它会尝试找到与构造函数参数类型匹配的提供程序,解析它们并将它们传递给构造函数,如

new MyClass(someArg);

ngoninit是Angular调用的生命周期钩子,用于指示Angular创建组件的工作已经完成。

我们必须像这样导入oninit才能使用它(实际上实现oninit不是强制性的,但被认为是良好的实践):

import { Component, OnInit } from '@angular/core';

然后,为了使用oninit方法,我们必须这样实现类:

export class App implements OnInit {
  constructor() {
     // Called first time before the ngOnInit()
  }

  ngOnInit() {
     // Called after the constructor and called  after the first ngOnChanges() 
  }
}

实现此接口以在指令的数据绑定属性初始化后执行自定义初始化逻辑。在第一次检查指令的数据绑定属性之后,以及在检查它的任何子属性之前,立即调用ngOnInit。在实例化指令时只调用一次。

大多数情况下,我们使用ngoninit进行所有的初始化/声明,避免在构造函数中工作。构造函数应该只用于初始化类成员,而不应该做实际的“工作”。

因此,您应该使用constructor()来设置依赖项注入,而不是使用其他方法。ngOnInit()是“开始”的更好的地方--它是解析组件绑定的地方/时间。

有关更多信息,请参阅此处:

>

  • https://angular.io/api/core/oninit

    Angular Component构造函数与OnInit

  •  类似资料:
    • 问题内容: 我一直在做大学项目的作业。有一次,当您实际上可以使用构造函数方法来实现相同的结果时,我对于getter和setter的实际使用感到困惑。我已经搜索并找到许多答案,但没有令人满意的解释。我有如下laptop.java 和laoptopRecords.java调用构造函数为 在这里,我没有使用getter和setter方法,并且为每个便携式计算机对象都获得了理想的结果。 如果我以如下方式在

    • 本文向大家介绍php构造函数与析构函数,包括了php构造函数与析构函数的使用技巧和注意事项,需要的朋友参考一下 php构造函数是对象创建完成后,第一个自动调用的方法,析构函数是当对象被释放之前最后一个自动调用的方法。本文章向大家介绍php构造函数与析构函数。 php构造函数 1.是对象创建完成后,“第一个”“自动调用”的方法 2.构造方法的定义,方法名是一个固定的, 在php4中:和类名相同的方法

    • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

    • 问题内容: 有人可以澄清Javascript中的构造函数和工厂函数之间的区别。 何时使用一个代替另一个? 问题答案: 基本区别在于,构造函数与关键字一起使用(这会使JavaScript自动创建一个新对象,在该函数内将该对象设置为该对象,然后返回该对象): 工厂函数的调用类似于“常规”函数: 但是要使其成为“工厂”,就需要返回某个对象的新实例:如果它仅返回布尔值或其他内容,则不会将其称为“工厂”函数

    • 本文向大家介绍JS构造函数与原型prototype的区别介绍,包括了JS构造函数与原型prototype的区别介绍的使用技巧和注意事项,需要的朋友参考一下 构造函数方法很好用,但是存在一个浪费内存 通过原型法分配的函数是所有对象共享的. 通过原型法分配的属性是独立.-----如果你不修改属性,他们是共享 如果我们希望所有的对象使用同一一个函数,最好使用原型法添加函数,这样比较节省内存. 例子: /

    • 本文向大家介绍Javascript 普通函数和构造函数的区别,包括了Javascript 普通函数和构造函数的区别的使用技巧和注意事项,需要的朋友参考一下 普通函数和构造函数的区别 在命名规则上,构造函数一般是首字母大写,普通函数遵照小驼峰式命名法。 在函数调用的时候: function fn() { }      构造函数:1. new fn( )                      2