IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Angular指令的生命周期 -> 正文阅读

[JavaScript知识库]Angular指令的生命周期

1. 使用指令来监视 DOM

可以深入了解你无法直接修改的 DOM 对象。你无法触及内置

的实现,也无法修改第三方组件,但是可以用指令来监视这些元素。
你可以把这个侦探指令写到任何内置元素或组件元素上,以观察它何时被初始化和销毁。
app.module.ts
表单要加入FormsModule, 引入自定义指令SpyDirective

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { Child1Component } from './components/father/components/child1/child1.component';
import { Child2Component } from './components/father/components/child2/child2.component';
import { FatherComponent } from './components/father/father.component';
import {ButtonModule} from 'primeng/button';
import { SpyComponent } from './components/father/components/spy/spy.component';
import { FormsModule } from '@angular/forms';
import { SpyDirective } from './directives/spy.directive';
import { CounterParentComponent } from './components/father/components/counter-parent/counter-parent.component';
import { CounterComponent } from './components/father/components/counter/counter.component';

@NgModule({
  declarations: [
    AppComponent,
    FatherComponent,
    Child1Component,
    Child2Component,
    SpyComponent,
    SpyDirective,
    CounterParentComponent,
    CounterComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    ButtonModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

father.component.html

<app-spy></app-spy>

spy.directive.ts

import { Directive, OnDestroy, OnInit } from '@angular/core';
let nextId = 1;
@Directive({
  selector: '[appSpy]'
})

export class SpyDirective implements OnInit, OnDestroy {
  private id = nextId++;

  constructor() { }
  
  ngOnInit() {
    console.log(`spy-direcitve ngOnInit:${this.id}`);
  }
  ngOnDestroy() {
    console.log(`spy-direcitve ngOnDestroy:${this.id}`);
  }

}

spy.component.html

<div>
  <h1>Spy Directive</h1>
  <label>Hero name:</label>
  <input type="text" [(ngModel)]="newName" (keyup.enter)="addHero()"/>
  
  <button pButton type="button" (click)="addHero()">Add Hero</button>
  <button pButton type="button" class="p-button-outlined" (click)="reset()">Reset Heroes</button>

  <p *ngFor="let hero of heroes" appSpy>
    {{hero}}
  </p>

</div>

spy.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-spy',
  templateUrl: './spy.component.html',
  styleUrls: ['./spy.component.css']
})
export class SpyComponent implements OnInit {
  public newName:string = "";
  public heroes: string[] = ['hero1', 'hero2']
  constructor() { }

  ngOnInit() {
    console.log(`app-spy: ngOnInit`);
  }
  addHero() {
    console.log('addHero')
    if(this.newName.trim()) {
      this.heroes.push(this.newName.trim())
      this.newName = '';
    }
    console.log(this.heroes);
  }
  removeHero(hero:string) {
    this.heroes.splice(this.heroes.indexOf(hero), 1)
  }
  reset() {
    this.heroes = [];
  }
}

运行结果:

在这里插入图片描述

2. 同时使用组件和指令的钩子

在这个例子中,CounterComponent 使用了 ngOnChanges() 方法,以便在每次父组件递增其输入属性 counter 时记录一次变更。
这个例子将前例中的 SpyDirective 用于 CounterComponent 的日志,以便监视这些日志条目的创建和销毁。

father.component.html

<app-counter-parent></app-counter-parent>

counter-parent.component.html

<div>
  <h2>Counter Spy</h2>

  <button pButton type="button" (click)="updateCounter()">Update Counter</button>
  <button pButton type="button" class="p-button-outlined" (click)="reset()">Reset Counter</button>

  <app-counter [counter]="value"></app-counter>
</div>

counter-parent.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-counter-parent',
  templateUrl: './counter-parent.component.html',
  styleUrls: ['./counter-parent.component.css']
})
export class CounterParentComponent implements OnInit {
  public value: number = 0;
  constructor() { }

  ngOnInit() {
    console.log(`app-counter-parent ngOnInit`)
  }
  updateCounter() {
    this.value += 1;
    console.log(`value: ${this.value}`);
  }
  reset() {
    this.value = 0;
    console.log(`value: ${this.value}`);
  }

}

counter.component.html

<div>
  <p>Counter: {{counter}}</p>

  <div>
    <h3>Counter Change Log</h3>
    <div *ngFor="let chg of changeLog" appSpy >{{chg}}</div>
  </div>
</div>

counter.component.ts

import { Component, Input, OnInit, SimpleChanges } from '@angular/core';

@Component({
  selector: 'app-counter',
  templateUrl: './counter.component.html',
  styleUrls: ['./counter.component.css']
})
export class CounterComponent implements OnInit {
  @Input() counter:number = 0;
  public changeLog: string[] = [];
  constructor() { }

  ngOnInit() {
    console.log(`app-counter ngOnInit`)
  }
  ngOnChanges(changes: SimpleChanges): void {
    const changeCounter = changes['counter'];
    const changeCounterCurrent = changeCounter.currentValue;
    const changeCounterPervious = changeCounter.previousValue;
    this.changeLog.push(`counter: currentValue = ${changeCounterCurrent}, previousValue = ${changeCounterPervious}`)
    if(this.counter === 0) this.changeLog = [];
    
  }

}

运行结果:

在这里插入图片描述

3. 学习地址

Angular官网

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:43:13  更:2021-12-13 12:44:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:37:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码