详解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 相关文章推荐
跟着JQuery API学Jquery 之二 属性
Apr 09 Javascript
如何使用json在前后台进行数据传输实例介绍
Apr 11 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
js中的scroll和offset 使用比较的实例与分析
Sep 29 Javascript
一个Action如何调用两个不同的方法
May 22 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
javascript Function函数理解与实战
Dec 01 Javascript
JS装饰器函数用法总结
Apr 21 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
jQuery实现简单弹幕效果
Nov 28 jQuery
详解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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
PHP开发框架总结收藏
2008/04/24 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
浅析关于PHP位运算的简单权限设计
2013/06/30 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
PHP PDO操作总结
2014/11/17 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
React中的render何时执行过程
2018/04/13 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
Python的Urllib库的基本使用教程
2015/04/30 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
Python Django 命名空间模式的实现
2019/08/09 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
交通法规咨询中心工作职责
2013/11/27 职场文书
化学学院毕业生自荐信范文
2013/12/17 职场文书
应届毕业生求职信范文分享
2013/12/26 职场文书
HR求职自荐信范文
2014/06/21 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python