Angular2: двусторонняя привязка внутри родительского/дочернего компонента

Версия: "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>

Затем я хотел бы распространить это изменение на его родительский компонент. Я пробовал с [(name)]="name" без успеха.

Родительский компонент:

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

Пример кода

Какой самый простой способ сделать это (менее подробный)?

Ответы

Ответ 1

Для двухстороннего связывания используйте @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;
}

Ответ 2

Вам нужно использовать элементы ввода/вывода в дочернем компоненте, как описано ниже:

@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();
}

Когда обнаружено изменение, вам необходимо запустить событие с помощью EventEmitter:

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

Таким образом, связанный элемент родительского компонента будет автоматически обновляться при использовании следующего синтаксиса:

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

Вы можете заметить, что вы можете использовать событие ngModelChange, если вы хотите обнаружить изменение ввода вместо использования отправки формы:

@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);
  }
}