¿Cómo pasar dos parámetros a EventEmitter en Angular 9?

En Angular, podemos transmitir los datos en ambas direcciones, es decir, adentro: al componente secundario y afuera: al componente principal. Para enviar datos al componente secundario, usamos el enlace de propiedad y para este último usamos EventEmitter.

En este artículo, hablaremos sobre la directiva EventEmitter y cómo podemos pasarle 2 parámetros.

Echemos un vistazo al código fuente de EventEmitter:

export declare class EventEmitter<T> 
                  extends Subject<T> {
    __isAsync: boolean;
    constructor(isAsync?: boolean);
    emit(value?: T): void;
    subscribe(
        generatorOrNext?: any, error?:
            any, complete?: any): any;
}

Es claramente visible que en el método de emisión solo se puede pasar un parámetro de tipo T, por lo que no podemos pasarle dos parámetros directamente. En su lugar, podemos crear un objeto que contenga todos los parámetros y pasar el objeto como una sola entidad.

Acercarse:

  • EventEmitter nos permite emitir cualquier tipo de objeto, por lo que le sacaremos partido.
  • Para pasar los parámetros, envolveremos todos los parámetros dentro de las llaves (esto los combinará como un solo objeto) y lo pasaremos al método de emisión.
  • Para recibir los parámetros en el componente principal, crearemos un tipo de objeto similar y actualizaremos su valor con el del objeto recibido.

Sintaxis:

@Output() sendobject = new EventEmitter<any>();

this.sendobject.emit({stringval, numval, ...});

Ejemplo: Crearemos dos propiedades en el componente secundario y las recibiremos en el componente principal mediante EventEmitter.

Código para el componente secundario:

import { 
       Component, OnInit, EventEmitter, Input, Output
      } from '@angular/core';
  
@Component({
  selector: 'app-test',
    
  template: `
    <h2>child component<h2>
    <h4>{{name}}</h4>
    <h4>{{age}}</h4>
    <button (click) = "send_name_age()">send data</button>
  `,
  styles: []
})
export class TestComponent {
  
  constructor() { }
  
  public name = "geek2";
  public age = 22;
    
  /* we will define the type of the
     an object that will be emitted.*/
    
  @Output() public data = 
        new EventEmitter<{name:string, age:number}>();
  
  send_name_age()
  {
    
  /* we will wrap the parameters 
     to be sent inside the curly brackets.*/
    
    this.data.emit({name:this.name, age:this.age});
  }
  
  ngOnInit(): void {
  }
  
}

Código para el componente padre:

import { Component } from '@angular/core';
  
@Component({
    selector: 'app-root',
    template: `
   
    <div style="text-align: center;" >
        <h1>parent component</h1>
        <h2>{{model.name}}</h2>
        <h2>{{model.age}}</h2>
    </div>
     
    /* The data that is sent by the
       child component will be 
       received in the */
   
    /* Parent component as a parameter 
       for change_name_age method. */
   
  <app-test (data) = "change_name_age($event)" >
  </app-test>
   
  `,
    styleUrls: []
})
export class AppComponent {
  
    /* Create a model of the type that is 
       emitted by the child component to 
       receive it.*/
  
    public model = { name: "geek1", age: 24 }
  
    change_name_age(data) {
  
        /* Update the current model with
           the value sent by the child 
           component. */
        this.model = data;
    }
}

Producción:

Recibió correctamente la edad y el nombre del componente secundario en el componente principal.

  • Antes de recibir nombre y edad:
  • El nombre y la edad en el componente principal se actualizan después de recibirlo del componente secundario.

Publicación traducida automáticamente

Artículo escrito por vaibhav19verma y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *