美文网首页Angular框架专题
Angular框架中的Output属性装饰器

Angular框架中的Output属性装饰器

作者: 听书先生 | 来源:发表于2021-12-07 23:18 被阅读0次
1、前言

Output属性装饰器主要是用来定义组件内的输出属性,来实现子组件将信息通过事件的形式通知到父级组件。

  • EventEmitter:
    EventEmitter用来触发自定义事件的
let  numberEmitter: EventEmitter<number> = new EventEmitter<number>();

numberEmitter.subscribe((value:number)=>{ console.log(value) });

numberEmitter.emit(10);

EventEmitter的实际开发应用场景:子指令创建一个EventEmitter实例,并将其作为输出属性导出,子指令调用已创建的EventEmitter实例中的emit(payload)方法来触发一个事件,父指令通过事件绑定(eventName)的方式监听该事件,并通过$event对象来获取payload对象。
子组件:

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

@Component({
  selector: 'app-alarm',
  template: `
    <button (click)="increment()"> + </button>
    <span style="margin:0 20px">{{ number }}</span>
    <button (click)="decrement()"> - </button>
  `,
  styleUrls: ['./alarm.component.less'],
  inputs: ['number:value']
})
export class AlarmComponent implements OnChanges {

  _number:number = 0; // 一般私有属性用下划线开头或者$开头

  /** 监测输入的属性值的变化 */
  ngOnChanges(changes: SimpleChanges): void {
    console.dir(changes['number']);
  }

  @Output() change: EventEmitter<number> = new EventEmitter<number>();

  @Input() 
  set number(num:number) {
    this._number = num; //将接收到的值进行赋值操作
  }

  get number() {
    return this._number;
  }

  constructor() { }

  increment():void {
    this.number++;
    this.change.emit(this._number);
  }

  decrement():void {
    this.number--;
    this.change.emit(this._number);
  }

}

父组件:

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

@Component({
  selector: 'app-home',
  template: `
    <p>子组件当前改变后的值:{{ data }}</p>
    <app-alarm [number]="num" (change)="handleChange($event)"></app-alarm>
  `,
  styleUrls: ['./home.component.less']
})

export class HomeComponent implements OnInit {

  num = 4;
  data = 0;

  ngAfterViewInit() { }

  constructor() { }

  ngOnInit() {
    
  }

  handleChange(e:any) {
    this.data = e;
  }

}

2、@Output('bindingPropertyName')

Output 装饰器支持一个可选的参数,用来指定组件绑定属性的名称。如果没有指定,则默认使用 @Output 装饰器,装饰的属性名。

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

@Component({
  selector: 'app-alarm',
  template: `
    <button (click)="increment()"> + </button>
    <span style="margin:0 20px">{{ number }}</span>
    <button (click)="decrement()"> - </button>
  `,
  styleUrls: ['./alarm.component.less'],
  inputs: ['number:value']
})
export class AlarmComponent implements OnChanges {

  _number:number = 0; // 一般私有属性用下划线开头或者$开头

  /** 监测输入的属性值的变化 */
  ngOnChanges(changes: SimpleChanges): void {
    console.dir(changes['number']);
  }

  @Output('countChange') change: EventEmitter<number> = new EventEmitter<number>();

父组件的调用的自定义事件名进行替换成countChange

@Component({
  selector: 'app-home',
  template: `
    <p>子组件当前改变后的值:{{ data }}</p>
    <app-alarm [number]="num" (countChange)="handleChange($event)"></app-alarm>
  `,
  styleUrls: ['./home.component.less']
})

3、实时监听数据的变化

在子组件的number值发生变化时的时候,同步的去更新父组件的值,可以使用change事件去进行监听。
父组件:

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

@Component({
  selector: 'app-home',
  template: `
    <p>子组件当前改变后的值:{{ num }}</p>
    <app-alarm [number]="num" (countChange)="num = $event"></app-alarm>
  `,
  styleUrls: ['./home.component.less']
})

export class HomeComponent implements OnInit {

  num = 4;

  ngAfterViewInit() { }

  constructor() { }

  ngOnInit() {
    
  }

}

子组件:

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

@Component({
  selector: 'app-alarm',
  template: `
    <button (click)="increment()"> + </button>
    <span style="margin:0 20px">{{ number }}</span>
    <button (click)="decrement()"> - </button>
  `,
  styleUrls: ['./alarm.component.less'],
  inputs: ['number:value']
})
export class AlarmComponent implements OnChanges {

  _number:number = 0; // 一般私有属性用下划线开头或者$开头

  /** 监测输入的属性值的变化 */
  ngOnChanges(changes: SimpleChanges): void {
    console.dir(changes['number']);
  }

  @Output('countChange') change: EventEmitter<number> = new EventEmitter<number>();

  @Input() 
  set number(num:number) {
    this._number = num; //将接收到的值进行赋值操作
  }

  get number() {
    return this._number;
  }

  constructor() { }

  increment():void {
    this.number++;
    this.change.emit(this._number);
  }

  decrement():void {
    this.number--;
    this.change.emit(this._number);
  }

}

相关文章

  • Angular框架中的Output属性装饰器

    1、前言 Output属性装饰器主要是用来定义组件内的输出属性,来实现子组件将信息通过事件的形式通知到父级组件。 ...

  • Angular框架中的@Input()属性装饰器

    1、前言 angular中,Input是属性装饰器,用来定义组件内的输入属性。在实际的开发中主要用于父组件向子组件...

  • angular中的装饰器 详解

    Angular中的装饰器是一个函数,它将元数据添加到类、类成员(属性、方法)和函数参数。 用法:要想应用装饰器,把...

  • angular中的装饰器 详解

    Angular中的装饰器是一个函数,它将元数据添加到类、类成员(属性、方法)和函数参数。用法:要想应用装饰器,把它...

  • angular-装饰器

    装饰器在angular中大量使用,有必要单独拎出来说一下。装饰器顾名思义,就是装饰用的,装饰什么呢?主要是类、属性...

  • Angular装饰器介绍

    装饰器的作用就是在添加装饰器的地方在不改动原有代码的情况下增加额外的功能。Angular框架中装饰器是一个函...

  • Angular 的同级组件传参

    1. 我们知道,在 Angular 框架中,可以用 @Input 和 @Output 来进行父子组建的传参, 不是...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • ionic2- 导航页面

    Page页面在angular语法上也是一个组件,所以同样有@Component装饰器,但是其selector属性可...

  • 39_了解JavaScript中的装饰器吗?聊一下JS中的get

    JavaScript中的装饰器 JavaScript中,装饰器是一种用于修饰类(class)、方法、属性的装饰,装...

网友评论

    本文标题:Angular框架中的Output属性装饰器

    本文链接:https://www.haomeiwen.com/subject/srqzxrtx.html