子コンポーネントの値を親コンポーネントにバインドしたいのですが。 @Input()
と[(ngModel)]
では不十分な場合にこれを行うにはどうすればよいですか?
ここでも@Output
を設定し、コンポーネントを次のように変更する必要があります
export class CounterComponent {
@Output('initoChange') emitter: EventEmitter<string> = new EventEmitter<string>();
@Input('inito') set setInitoValue(value) {
this.count = value;
}
count: number = 0;
increment() {
this.count++;
this.emitter.emit(this.count);
}
decrement() {
this.count--;
this.emitter.emit(this.count);
}
}
plunker へのリンクはこちらです。
次のような双方向のデータバインディングを作成できます。
_@Component({
selector: 'app-sizer',
template: `
<div>
<button (click)="dec()" title="smaller">-</button>
<button (click)="inc()" title="bigger">+</button>
<label [style.font-size.px]="size">FontSize: {{size}}px</label>
</div>`
})
export class SizerComponent {
@Input() size: number | string;
@Output() sizeChange = new EventEmitter<number>();
dec() { this.resize(-1); }
inc() { this.resize(+1); }
resize(delta: number) {
this.size = Math.min(40, Math.max(8, +this.size + delta));
this.sizeChange.emit(this.size);
}
}
_
親コンポーネントのテンプレートで、次のようにsize
に双方向バインディングを作成します。
_<app-sizer [(size)]="fontSizePx"></app-sizer>
<div [style.font-size.px]="fontSizePx">Resizable Text</div>
_
これ(双方向バインディング)はプロパティバインディングの単なる構文糖なので、次と同等です。
_<app-sizer [size]="fontSizePx" (sizeChange)="fontSizePx=$event"></app-sizer>
_
prop
にInput
と呼ばれるprop
プロパティと、Output
という名前のイベント(propChange
プロパティ)がある場合、[(prop)]
構文を使用できます。
コードは次のとおりですangularドキュメント詳細については、このアドレスに移動してください: https://angular.io/guide/template-syntax#two-way-binding--- =
たとえば、@Output()
を使用します
@Output() event: EventEmitter<Type> = new EventEmitter();
emit
関数を介してデータを送信する
send(): void {
this.event.emit(data);
}
EventEmitter の詳細を読む