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>
¿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>
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