Angular的constructor和ngOnInit里写代码有什么区别?

举报
汪子熙 发表于 2022/04/25 12:49:48 2022/04/25
【摘要】 参考这个StackOverflow讨论Difference between Constructor and ngOnInit得赞超过1000的答案:The Constructor is a default method of the class that is executed when the class is instantiated and ensures proper initial...

参考这个StackOverflow讨论Difference between Constructor and ngOnInit

得赞超过1000的答案:

The Constructor is a default method of the class that is executed when the class is instantiated and ensures proper initialisation of fields in the class and its subclasses. Angular, or better Dependency Injector (DI), analyses the constructor parameters and when it creates a new instance by calling new MyClass() it tries to find providers that match the types of the constructor parameters, resolves them and passes them to the constructor like

当class被实例化时,constructor是默认被执行的方法,确保类和其子类都被正确地初始化。Angular依赖注入机制,会分析constructor的输入参数,当使用new MyClass创建class实例时,会试着去查找能匹配构造函数类型的providers,解析providers并将结果传递到类的构造函数里。

ngOnInit is a life cycle hook called by Angular to indicate that Angular is done creating the component.

ngOnInit是一个生命周期钩子,Angular调用ngOnInit时,向应用程序传递这样一个信息:Angular已经完成了Component的创建工作。

We have to import OnInit like this in order to use it (actually implementing OnInit is not mandatory but considered good practice):

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

ngOnInit的使用并不是毫无代价的,得需要导入OnInit,然后实现这个hook:

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

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

Implement this interface to execute custom initialization logic after your directive’s data-bound properties have been initialized. ngOnInit is called right after the directive’s data-bound properties have been checked for the first time, and before any of its children have been checked. It is invoked only once when the directive is instantiated.

Mostly we use ngOnInit for all the initialization/declaration and avoid stuff to work in the constructor. The constructor should only be used to initialize class members but shouldn’t do actual “work”.

So you should use constructor() to setup Dependency Injection and not much else. ngOnInit() is better place to “start” - it’s where/when components’ bindings are resolved.

最佳实践

constructor只用于setup依赖注入,以及初始化类的成员。其他所有业务相关的自定义初始化逻辑,均放在ngOnInit hook里完成。

ABAP

sy-CPROG

ABSL

C

__FILE__用以指示本行语句所在源文件的文件名.

#include <stdio.h>
int main()
{
printf("%s\n",__FILE__);
}

vi另存为test.c, gcc编译生成a.out,执行后输出结果为:
test.c
__LINE__用以指示本行语句在源文件中的位置信息,

输出:
4
5
6

nodejs

webpack配置文件里随处可见这种全局变量__dirname的使用:

example:
running node example.js from /Users/mjr

console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。