pasar parametros hijo entre comunicacion componentes angular

parametros - output angular 6



Angular2: enlace bidireccional dentro del componente padre/hijo (4)

Debe utilizar elementos de entrada / salida en el componente secundario, como se describe a continuación:

@Component({ selector:''input-test'' template: ` <form (ngSubmit)="onSubmit()" #testform="ngForm"> {{name}} <textarea #textarea [(ngModel)]="name" ngControl="name" name="name"></textarea> <button type="submit">Go</button> </form> ` }) export class InputTestComponent { @Input() name:string; @Output() nameChange:EventEmitter<string> = new EventEmitter(); }

Cuando se detecta un cambio, debe EventEmitter un evento utilizando el EventEmitter :

onSubmit() { this.nameChange.emit(this.name); }

De esta manera, el elemento enlazado del componente principal se actualizará automáticamente cuando se use la siguiente sintaxis:

<input-test [(name)]="name"></input-test>

Puede observar que puede aprovechar el evento ngModelChange si desea detectar un cambio en la entrada en lugar de utilizar el envío de formularios:

@Component({ selector:''input-test'' template: ` <form #testform="ngForm"> {{name}} <textarea #textarea [ngModel]="name" (ngModelChange)="onChange($event)" ngControl="name" name="name"></textarea> </form> ` }) export class InputTestComponent { @Input() name:string; @Output() nameChange:EventEmitter<string> = new EventEmitter(); onChange(newName) { this.name = newName; this.nameChange.emit(this.name); } }

Versión: "angular2": "2.0.0-beta.6"

Me gustaría implementar un enlace de dos vías dentro de un caso de componente padre / hijo.

En el componente de mi hijo, estoy usando un enlace bidireccional para mostrar texto mientras edito.

Componente hijo ( InputTestComponent [selector:''input-test''] ):

<form (ngSubmit)="onSubmit()" #testform="ngForm"> {{name}} <textarea #textarea [(ngModel)]="name" ngControl="name" name="name"></textarea> <button type="submit">Go</button> </form>

Entonces, me gustaría propagar este cambio a su componente principal. Lo intenté con [(name)]="name" sin éxito.

Componente principal:

<div> {{name}} <input-test [(name)]="name"></input-test> </div>

Muestra de código

¿Cuál es la forma más fácil de hacerlo (menos verbosa)?


Para el enlace bidireccional use @Input() y @Output() . Los nombres deben ser propName y propNameChange para permitir la sintaxis de enlace abreviada [(propName)]="someModel" contrario necesitaría la versión más larga [propName]="someModel" (propNameOtherOutputName)="propName=$event;propNameOtherOutputName.emit($event)"

@Component{ ... template: ` <textarea #textarea [(ngModel)]="name" (ngModelChange)="nameChange.emit($event)" ngControl="name" name="name"></textarea> `}) export class InputTestComponent { @Output() nameChange:EventEmitter<String> = new EventEmitter<String>(); @Input() name:string; }


Puede configurar un enlace de datos bidireccional entre el componente principal y el secundario de las siguientes maneras:

<app-child [(counter)]="counter"></app-child> <app-child [counter]="counter" (counterChange)="counter=$event"></app-child> <app-child [counter]="counter" (counterChange)="onCounterChange($event)"></app-child>

Según Angular - Sintaxis de plantilla - Enlace bidireccional :

Angular ofrece una sintaxis especial de enlace de datos bidireccional para este propósito, [(x)]. La sintaxis [(x)] combina los paréntesis del enlace de propiedades, [x], con los paréntesis del enlace de eventos, (x).

<app-child [(counter)]="counter"></app-child>

La sintaxis [(x)] es fácil de demostrar cuando el elemento tiene una propiedad configurable llamada x y un evento correspondiente llamado xChange.

@Input() counter: number; @Output() counterChange = new EventEmitter<number>();

La sintaxis de enlace bidireccional es en realidad solo azúcar sintáctica para un enlace de propiedad y un enlace de evento. Desugars angulares que el componente ChildComponent en este:

<app-child [counter]="counter" (counterChange)="counter=$event"></app-child>

Ejemplo: https://stackblitz.com/edit/angular-two-way-data-binding-between-parent-and-child-component?file=src%2Fapp%2Fapp.component.ts

import { Component, Input, Output, EventEmitter } from ''@angular/core''; @Component({ selector: ''app-root'', template: ` <div style="background-color: red; padding: 10px;"> <div>{{counter}}</div> <button (click)="increment()">increment from parent</button> <app-child [(counter)]="counter"></app-child> <app-child [counter]="counter" (counterChange)="counter=$event"></app-child> <app-child [counter]="counter" (counterChange)="onCounterChange($event)"></app-child> </div> ` }) export class AppComponent { counter = 0; increment() { this.counter++; } onCounterChange(counter: number) { this.counter = counter; } } @Component({ selector: ''app-child'', template: ` <div style="background-color: green; padding: 10px; margin: 10px;"> <div>{{counter}}</div> <button (click)="increment()">increment from child</button> </div> `, }) export class ChildComponent { @Input() counter: number; @Output() counterChange = new EventEmitter<number>(); constructor() { } increment() { this.counterChange.emit(++this.counter); } }


Sí, podemos usar la propiedad de banana para compartir los datos entre el elemento secundario al padre [(propertyname)] y el evento de propertynameChange . Plunker de muestra disponible https://plnkr.co/edit/FYXv36?p=preview