详解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操作文本框readOnly
May 15 Javascript
JS中Iframe之间传值的方法
Mar 11 Javascript
Javascript的严格模式strict mode详细介绍
Jun 06 Javascript
javascript制作坦克大战全纪录(2)
Nov 27 Javascript
Js可拖拽放大的层拖动特效实现方法
Feb 25 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
JS通过调用微信API实现微信支付功能的方法示例
Jun 29 Javascript
swiper插件自定义切换箭头按钮
Dec 28 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
Apr 26 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 Javascript
微信小程序 scroll-view的使用案例代码详解
Jun 11 Javascript
多个Vue项目部署到服务器的步骤记录
Oct 22 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
Python 统计字数的思路详解
2018/05/08 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
中专生职业生涯规划书范文
2014/01/10 职场文书
管理专员自荐信
2014/01/26 职场文书
20年同学聚会感言
2014/02/03 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
物流专业求职信
2014/06/30 职场文书
辩护词范文大全
2015/05/21 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS