版本:"angular2":"2.0.0-beta.6"
我想在父/子组件案例中实现双向绑定.
在我的子组件上,我在编辑时使用双向绑定来显示文本.
子组件(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>
Run Code Online (Sandbox Code Playgroud)
然后,我想将此更改传播到其父组件.我试过[(name)]="name"没有成功.
父组件:
<div>
{{name}}
<input-test [(name)]="name"></input-test>
</div>
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么(不那么冗长)?
Gün*_*uer 36
对于双向绑定使用@Input()和@Output().名称应该是propName和propNameChange允许速记绑定语法,[(propName)]="someModel"否则你需要更长的版本[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;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式在父组件和子组件之间设置双向数据绑定:
<app-child [(counter)]="counter"></app-child>
<app-child [counter]="counter" (counterChange)="counter=$event"></app-child>
<app-child [counter]="counter" (counterChange)="onCounterChange($event)"></app-child>
Run Code Online (Sandbox Code Playgroud)
为此,Angular 提供了一种特殊的双向数据绑定语法 [(x)]。[(x)] 语法将属性绑定的括号 [x] 与事件绑定的括号 (x) 组合在一起。
<app-child [(counter)]="counter"></app-child>
Run Code Online (Sandbox Code Playgroud)
当元素具有名为 x 的可设置属性和名为 xChange 的相应事件时,[(x)] 语法很容易演示。
@Input() counter: number;
@Output() counterChange = new EventEmitter<number>();
Run Code Online (Sandbox Code Playgroud)
双向绑定语法实际上只是属性绑定和事件绑定的语法糖。Angular 将 ChildComponent 绑定脱糖为:
<app-child [counter]="counter" (counterChange)="counter=$event"></app-child>
Run Code Online (Sandbox Code Playgroud)
示例: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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22460 次 |
| 最近记录: |