ParentComponentとChildComponentがあり、ParentComponentのngModelをChildComponentに渡す必要があります。
// the below is in ParentComponent template
<child-component [(ngModel)]="valueInParentComponent"></child-component>
childComponentでngModelの値を取得して操作するにはどうすればよいですか?
子クラスにControlValueAccessor
を実装する必要があります。 angular方法を使用してバインドできる「値を持つ」コンポーネントとしてコンポーネントを定義するものです。
詳細についてはこちらをご覧ください: http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html
親->子の場合、@ Inputを使用します
子->親の場合、@ Outputを使用します
したがって、両方を使用するには:
親コンポーネント内
TypeScript:
onValueInParentComponentChanged(value: string) {
this.valueInParentComponent = value;
}
HTML
<child-component
(onValueInParentComponentChanged)="onValueInParentComponentChanged($event)"
[valueInParentComponent]="valueInParentComponent">
</child-component>
子コンポーネント内
TypeScript:
export class ChildComponent {
@Input() valueInParentComponent: string;
@Output() onValueInParentComponentChanged = new EventEmitter<boolean>();
}
onChange(){
this.onValueInParentComponentChanged.emit(this.valueInParentComponent);
}
HTML
<input type="text" [(ngModel)]="valueInParentComponent"
(ngModelChange)="onChange($event)"/>
完全な例
https://plnkr.co/edit/mc3Jqo3SDDaTueNBSkJN?p=preview
これを達成する他の方法:
https://angular.io/docs/ts/latest/cookbook/component-communication.html
フォームコントロールをラップしようとしているようです。そのためのライブラリを作成しました! s-ng-utils
には、親コンポーネントに使用するスーパークラス WrappedFormControlSuperclass
があります。次のように使用できます。
@Component({
template: `
<!-- anything fancy you want in your parent template -->
<child-component [formControl]="formControl"></child-component>
`,
providers: [provideValueAccessor(ParentComponent)],
})
class ParentComponent extends WrappedFormControlSuperclass<ValueType> {
// This looks unnecessary, but is required for Angular to provide `Injector`
constructor(injector: Injector) {
super(injector);
}
}
@Amitの答えが示唆するように、これは<child-component>
にControlValueAccessor
があることを前提としています。自分で<child-component>
を書いている場合は、s-ng-utils
にもスーパークラスがあり、それを助けます: FormControlSuperclass
。