详解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 相关文章推荐
JavaScript 事件参考手册
Dec 24 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
Jul 30 Javascript
JavaScript插入动态样式实现代码
Feb 22 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
jQuery针对各类元素操作基础教程
Aug 29 Javascript
浅谈Angular4中常用管道
Sep 27 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
对Vue table 动态表格td可编辑的方法详解
Aug 28 Javascript
ajax与jsonp的区别及用法
Oct 16 Javascript
vue-cli3配置与跨域处理方法
Aug 17 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
Apr 28 Javascript
解决js中的setInterval清空定时器不管用问题
Nov 17 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遍历数组的方法汇总分析
2013/06/08 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
python中文乱码的解决方法
2013/11/04 Python
Python unittest单元测试框架总结
2018/09/08 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
追悼会上的答谢词
2014/01/10 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
何玥事迹观后感
2015/06/16 职场文书
关于远足的感想
2015/08/10 职场文书
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS