详解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使用eval解析json实例与注意事项分享
Jan 18 Javascript
jQuery操作JSON的CRUD用法实例
Feb 25 Javascript
理解javascript函数式编程中的闭包(closure)
Mar 08 Javascript
基于jQuery实现Accordion手风琴自定义插件
Oct 13 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
Mar 07 Javascript
jquery鼠标悬停导航下划线滑出效果
Sep 29 jQuery
Vue官网todoMVC示例代码
Jan 29 Javascript
解决vue单页路由跳转后scrollTop的问题
Sep 03 Javascript
ES6 Promise对象的应用实例分析
Jun 27 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 Javascript
用vue设计一个日历表
Dec 03 Vue.js
如何用JS实现网页瀑布流布局
Apr 24 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 getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
YII框架关联查询操作示例
2019/04/29 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
Javascript 继承实现例子
2009/08/12 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
Python列表append和+的区别浅析
2015/02/02 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
python批量下载抖音视频
2019/06/17 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
python中turtle库的简单使用教程
2020/11/11 Python
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
英语故事演讲稿
2014/04/29 职场文书
心理咨询承诺书
2014/05/20 职场文书
董事长助理工作职责
2014/06/08 职场文书
2014年班组工作总结
2014/11/20 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书