Agregar elementos

Queremos agregar elementos a nuestra lista. Con Angular podemos hacer esto facilmente, y ver el elemento agregado inmediatamente. Haremos esto desd el componente inputComponent que creamos antes. Vamos a cambiarlo, así que cuando se presione Enter o cuando se de click en el botón, el valor del input se volverá el título de un nuevo elemeto. Y el nuevo elemento será agregado a la lista.

Pero nosotros no queremos que el componente todo-input sea el responsable de enviar el nuevo elemento a la lista. Queremos que este tenga la mínima responsabilidad, y delegue la acción a su componente padre. Una de las ventajas de esta aproximación es que el componente será reusable, y puede ser adjunto a diferentes acciones en diferentes situaciones.

Por ejemplo, en nuestro caso, seremos capaces de usar el inputComponent dentro de itemComponent. Entonces vamos a tener una caja de texto por cada elemento y vamos a poder editar el título del elemento. En este caso, presionando la tecla Enter o el botón Guardar tendrá un efecto diferente.

Entonces lo que queremos actualmente es emitir un evento desde el componente todo-input cuandl el título ha sido cambiado. ¡Con Angular podemos fácilmente emitir eventos desde nuestros componentes!

@Output()

Dentro de la clase inputComponent añadiremos la siguiente línea, la cual define un output para el componente.

@Output() submit: EventEmitter<string> = new EventEmitter();

La propiedad output es llamada submit Asegúrate de que Output and EventEmitter estén agregados en las sentencias de import en las primeras líneas del archivo:

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

Ahora, cuando llamemos this.submit.emit() un evento será emitido al componente padre. Vamos a llamarlo en el método changeTitle:

changeTitle(newTitle: string): void {
  this.submit.emit(newTitle);
}

Delegamos todo al componente padre - incluso actualmente cambiar el título del elemento si es necesitado. (El nombre del método puede parecer irrelevante ahora. Si quieres puedes cambiarlo a algo mas apropiado como submitValue. Recuerda cambiarlo en la plantilla también).

Pasamos newtitle cundo emitimos el evento. Lo que sea que pasemos en emit() estará disponible por el padre como $event.

Nada mas necesita ser cambiado en el componente todo-input. Los eventos emitidos por keyup.enter y click seguirán en el mismo método, pero el método en si ha cambiado.

Ahora necesitamos atrapar el evento en el componente padre y añadirle lógica a él. Ve al componente app-root y enlaza el evento submit en el componente <todo-input>:

<todo-input (submit)="addItem($event)"></todo-input>

Ahora todo lo que falta implmenentar es el método addItem, el cual recive una cadena y la añade a la lista:

addItem(title: string): void {    
  this.todoList.push({ title });
}

¡Pruébalo!

Last updated