详解Angular之constructor和ngOnInit差异及适用场景


Posted in Javascript onJune 22, 2017

Angular中根据适用场景定义了很多生命周期函数,其本质上是事件的响应函数,其中最常用的就是ngOnInit。但在TypeScript或ES6中还存在着名为constructor的构造函数,开发过程中经常会混淆二者,毕竟它们的含义有某些重复部分,那ngOnInit和constructor之间有什么区别呢?它们各自的适用场景又是什么呢?

区别

constructor是ES6引入类的概念后新出现的东东,是类的自身属性,并不属于Angular的范畴,所以Angular没有办法控制constructor。constructor会在类生成实例时调用:

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

@Component({
  selector: 'hello-world',
  templateUrl: 'hello-world.html'
})

class HelloWorld {
  constructor() {
    console.log('constructor被调用,但和Angular无关');
  }
}

// 生成类实例,此时会调用constructor
new HelloWorld();

既然Angular无法控制constructor,那么ngOnInit的出现就不足为奇了,毕竟枪把子得握在自己手里才安全。

ngOnInit的作用根据官方的说法:

ngOnInit用于在Angular第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。

ngOnInit属于Angular生命周期的一部分,其在第一轮ngOnChanges完成之后调用,并且只调用一次:

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

@Component({
  selector: 'hello-world',
  templateUrl: 'hello-world.html'
})

class HelloWorld implements OnInit {
  constructor() {

  }

  ngOnInit() {
    console.log('ngOnInit被Angular调用');
  }
}

constructor适用场景

即使Angular定义了ngOnInit,constructor也有其用武之地,其主要作用是注入依赖,特别是在TypeScript开发Angular工程时,经常会遇到类似下面的代码:

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

@Component({
  selector: 'hello-world',
  templateUrl: 'hello-world.html'
})
class HelloWorld {
  constructor(private elementRef: ElementRef) {
    // 在类中就可以使用this.elementRef了
  }
}

constructor中注入的依赖,就可以作为类的属性被使用了。

ngOnInit适用场景

ngOnInit纯粹是通知开发者组件/指令已经被初始化完成了,此时组件/指令上的属性绑定操作以及输入操作已经完成,也就是说在ngOnInit函数中我们已经能够操作组件/指令中被传入的数据了:

// hello-world.ts
import { Component, Input, OnInit } from '@angular/core';

@Component({
  selector: 'hello-world',
  template: `<p>Hello {{name}}!</p>`
})
class HelloWorld implements OnInit {
  @Input()
  name: string;

  constructor() {
    // constructor中还不能获取到组件/指令中被传入的数据
    console.log(this.name);   // undefined
  }

  ngOnInit() {
    // ngOnInit中已经能够获取到组件/指令中被传入的数据
    console.log(this.name);   // 传入的数据
  }
}

所以我们可以在ngOnInit中做一些初始化操作。

总结

开发中我们经常在ngOnInit做一些初始化的工作,而这些工作尽量要避免在constructor中进行,constructor中应该只进行依赖注入而不是进行真正的业务操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js用Date对象的setDate()函数对日期进行加减操作
Sep 18 Javascript
javascript组合使用构造函数模式和原型模式实例
Jun 04 Javascript
js实现的简单图片浮动效果完整实例
May 10 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 Javascript
使用jQuery和ajax代替iframe的方法(详解)
Apr 12 jQuery
AngularJS中table表格基本操作示例
Oct 10 Javascript
vue的全局变量和全局拦截请求器的示例代码
Sep 13 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
Apr 04 Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 Javascript
JSONP 的原理、理解 与 实例分析
May 16 Javascript
JavaScript如何判断对象有某属性
Jul 03 Javascript
JavaScript原生数组函数实例汇总
Oct 14 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
Jun 22 #Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 #jQuery
详解Vue 2.0封装axios笔记
Jun 22 #Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 #Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
Jun 22 #Javascript
vue 请求后台数据的实例代码
Jun 22 #Javascript
深入理解vue.js中的v-if和v-show
Jun 22 #Javascript
You might like
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
各种常用浏览器getBoundingClientRect的解析
2009/05/21 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
javascript的函数作用域
2014/11/12 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
Python中if __name__ == &quot;__main__&quot;详细解释
2014/10/21 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
python实现随机漫步算法
2018/08/27 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
python入门之基础语法学习笔记
2020/02/08 Python
python数据分析:关键字提取方式
2020/02/24 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
父亲追悼会答谢词
2014/01/17 职场文书
发展部经理职责规定
2014/02/22 职场文书
总经理人事任命书
2014/06/05 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL