Angular2:父/子组件内的双向绑定

plo*_*ne1 23 angular

版本:"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().名称应该是propNamepropNameChange允许速记绑定语法,[(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)

  • 工作良好![代码编辑](http://plnkr.co/edit/GO8BCcJleyNRURB29OOC?p=preview) (3认同)

Mil*_*nák 7

您可以通过以下方式在父组件和子组件之间设置双向数据绑定:

<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 - 模板语法 - 双向绑定

为此,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)