详解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高级程序设计(第3版)学习笔记10 再访js对象
Oct 11 Javascript
javascript中的if语句使用介绍
Nov 20 Javascript
JavaScript学习笔记之定时器
Jan 22 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
JS模拟按钮点击功能的方法
Dec 22 Javascript
JavaScript必知必会(六) delete in instanceof
Jun 08 Javascript
基于bootstrap的选择框插件icheck
Dec 23 Javascript
javascript基础知识之html5轮播图实例讲解(44)
Feb 17 Javascript
jQuery动态追加页面数据以及事件委托详解
May 06 jQuery
详解React服务端渲染从入门到精通
Mar 28 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
Jun 11 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
Django 路由控制的实现代码
2018/11/08 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python常用排序算法的实现代码
2019/11/08 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
结婚邀请函范文
2014/01/14 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
员工年终考核评语
2014/12/31 职场文书
考试后的感想
2015/08/07 职场文书
python机器学习实现oneR算法(以鸢尾data为例)
2022/03/03 Python