Angular2中constructor和ngOninit的使用讲解

目录
  • constructor和ngOninit的使用
    • 区别
    • 适用场景
  • ngOnInit函数学习小记
    • 例子

constructor和ngOninit的使用

Angular中根据适用场景定义了很多生命周期函数,其本质上是事件的响应函数,其中最常用的就是ngOnInit。在TypeScript或ES6中还存在着名为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();

所以就出现了ngOnInit;

ngOnInit的作用根据官方的说法:

ngOnInit用于在Angular第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件

所以总的来说:

1.ngOnChanges当数据绑定输入属性的值发生变化时候调用;

2.ngOnInit( )在第一次ngOnChanges( )后调用;说明这两个方法一般是配合工作的;

3.ngOnInit()用于Angular获取输入属性后初始化组件,此方法是钩子方法,在ngOnChanges()方法被调用之后使用;

4.ngOnInit()钩子只会被调用一次;

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中操作父组件传递到子组件的一些shu数据;

所以,开发中我们经常在ngOnInit做一些初始化的工作,而这些工作尽量要避免在constructor中进行,constructor中应该只进行依赖注入而不是进行真正的业务操作。

ngOnInit函数学习小记

ngOnInit方法只是初始化angular的组件和指令,并不是真正的dom加载完成

例子

html代码:

typescript代码:

这个时候oBox1无法获取到DOM节点,这是因为ngOnInit方法只是初始化angular的组件和指令,并不是真正的dom加载完成。

如果要获取到oBox1,可以在ngAfterViewInit方法里获取,该方法是指页面渲染完成之后触发!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Angular 中 ngOnInit 和 constructor 使用场景

    1. constructor constructor应该是ES6中明确使用constructor来表示构造函数的,构造函数使用在class中,用来做初始化操作.当包含constructor的类被实例化时,构造函数将被调用. 来看例子: class AppComponent { public name: string; constructor(name) { console.log('Constructor initialization'); this.name = name; } } let a

  • 详解Angular之constructor和ngOnInit差异及适用场景

    Angular中根据适用场景定义了很多生命周期函数,其本质上是事件的响应函数,其中最常用的就是ngOnInit.但在TypeScript或ES6中还存在着名为constructor的构造函数,开发过程中经常会混淆二者,毕竟它们的含义有某些重复部分,那ngOnInit和constructor之间有什么区别呢?它们各自的适用场景又是什么呢? 区别 constructor是ES6引入类的概念后新出现的东东,是类的自身属性,并不属于Angular的范畴,所以Angular没有办法控制constructo

  • 深入理解Angular2 模板语法

    1. 说明 Angular2的模板用来显示组件外观,作为视图所用,用法和html语法基本一致,最简单的Angular2的模板就是一段html代码.Angular模板语法主要包括以下几个部分: l 直接绑定 l 插值表达 l 属性绑定 l 事件绑定 l 双向绑定 l 样式绑定 l 模板和 * l 局部变量 首先来看一个模板例子,如下所示: import { Component, OnInit } from '@angular/core'; @Component({ selector: 'ui-de

  • Angular2中constructor和ngOninit的使用讲解

    目录 constructor和ngOninit的使用 区别 适用场景 ngOnInit函数学习小记 例子 constructor和ngOninit的使用 Angular中根据适用场景定义了很多生命周期函数,其本质上是事件的响应函数,其中最常用的就是ngOnInit.在TypeScript或ES6中还存在着名为constructor的构造函数,开发过程中经常会混淆二者,两者在含义上有部分重复,下面主要解析一下它们的区别和各自的使用场景. 区别 constructor:Es6引入类的概念后出来的东西

  • 对angular2中的ngfor和ngif指令嵌套实例讲解

    ng2 结构指令不能直接嵌套使用,可使用标签来包裹指令 示例如下 <ul> <ng-container *ngFor="let item of lists"> <div class="thumb p-date" *ngIf="item.picurl"> <a href="# " rel="external nofollow" ><img src=&quo

  • 详解Angular2中Input和Output用法及示例

    对于angular2中的Input和Output可以和AngularJS中指令作类比. Input相当于指令的值绑定,无论是单向的(@)还是双向的(=).都是将父作用域的值"输入"到子作用域中,然后子作用域进行相关处理. Output相当于指令的方法绑定,子作用域触发事件执行响应函数,而响应函数方法体则位于父作用域中,相当于将事件"输出到"父作用域中,在父作用域中处理. 看个angular2示例吧,我们定义一个子组件,获取父作用域的数组值并以列表形式显示,然后当点击

  • 在 Angular2 中实现自定义校验指令(确认密码)的方法

    我们会在本文中探索 Angular 2 内建的自定义验证. # 介绍 Angular 2 原生就支持一些有用的验证器: required: 验证字段必须存在 minlength: 验证字段值的最小长度有效 maxlength: 验证字段值的最大长度有效 pattern: 验证输入的值是否匹配给定的模板,比如 email 我们会基于下面的接口创建一个表单来获取用户信息. // user.interface.ts export interface User { username: string; /

  • angular2中Http请求原理与用法详解

    本文实例讲述了angular2中Http请求原理与用法.分享给大家供大家参考,具体如下: 提供HTTP服务 HttpModule并不是Angular的核心模块. 它是Angular用来进行Web访问的一种可选方式,并位于一个名叫@angular/http的独立附属模块中. 编辑app.module.ts import { HttpModule, JsonpModule } from '@angular/http'; @NgModule({ imports: [ HttpModule, Jsonp

  • Angular2中监听数据更新的方法

    angular2 模型数据更新了,需要监听数据改变, 一.实现接口Docheck,检测页面上所有元素数据更新 import { Component, DoCheck } from "@angular/core"; export class LangListUserComponent implements DoCheck { constructor(private differs: KeyValueDiffers) { } ngOnInit() { this.objDiffer = {}

  • 如何在Angular2中使用jQuery及其插件的方法

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大多基于jQuery和它的插件.而且现在Angular2的组件生态还不是很完善,我们在编写Angular的时候也许会想要用到jQuery.本篇文章就简单介绍下在Angular2中使用jQuery 如果你不知道怎么搭建Angular2开发环境,请参考这篇文章:http://www.jb51.net/ar

  • 详解如何在angular2中获取节点

    我们知道在angular2中ts文件支持js代码,为什么用document.getElementById没法获取元素节点呢? 其实在angular2中先加载ts文件,再加载view,所以获取不到节点. 在应用层直接操作 DOM,就会造成应用层与渲染层之间强耦合,导致我们的应用无法运行在不同环境,如 web worker 中,因为在 web worker 环境中,是不能直接操作 DOM. 通过 ElementRef 我们就可以封装不同平台下视图层中的 native 元素 (在浏览器环境中,nati

  • Angular2中select用法之设置默认值与事件详解

    本文主要给大家介绍了Angular2中select用法之设置默认值与事件的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 一.设置默认值: 现在有三个学生小明,小红,小黑,对双向绑定的student设置你想要的select值就可以在下拉框默认选中 code1: 设置"请选择"为默认项,只需要把变量student设置为'',即可默认到"请选择",需要注意的是 <option value="">请选择</option>

  • angular2中router路由跳转navigate的使用与刷新页面问题详解

    本文主要介绍的是angular2中router路由跳转navigate的使用与刷新页面问题的相关内容,分享出供大家参考学习,下面来看看详细的介绍: 一.router.navigate的使用 navigate是Router类的一个方法,主要用来跳转路由. 函数定义: navigate(commands: any[], extras?: NavigationExtras) : Promise`<boolean>` interface NavigationExtras { relativeTo :

随机推荐