【決定版】Angular2で子コンポーネントから親コンポーネントへメッセージを送信する方法
Angular 2 で子コンポーネントから親コンポーネントのプロパティを更新する方法
Input と Output を使用する
Input と Output は、Angular 2 でコンポーネント間でデータをやり取りするための最も基本的な方法です。
Input を使用して、親コンポーネントから子コンポーネントにデータをバインドできます。子コンポーネントは、@Input デコレータで修飾されたプロパティを使用して、親コンポーネントから渡されたデータを受け取ることができます。
Output を使用して、子コンポーネントから親コンポーネントにイベントを発行できます。親コンポーネントは、子コンポーネントから発行されたイベントをリッスンし、イベントハンドラーでイベントに応答することができます。
例
親コンポーネント (parent.component.ts
)
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-parent',
template: `
<app-child [message]="message" (childEvent)="onChildEvent($event)"></app-child>
`
})
export class ParentComponent {
message = 'Hello from parent!';
onChildEvent(event) {
console.log('Child event:', event);
}
}
import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<p>Message: {{ message }}</p>
<button (click)="emitChildEvent()">Send event to parent</button>
`
})
export class ChildComponent {
@Input() message: string;
@Output() childEvent = new EventEmitter<string>();
emitChildEvent() {
this.childEvent.emit('Hello from child!');
}
}
サービスを使用する
サービスは、コンポーネント間でデータを共有するための別の方法です。サービスは、コンポーネントから独立して存在し、コンポーネント間で共有できるプロパティとメソッドを提供します。
サービス (data.service.ts
)
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class DataService {
message = 'Hello from service!';
getMessage() {
return this.message;
}
setMessage(message: string) {
this.message = message;
}
}
import { Component, Inject } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-parent',
template: `
<app-child [message]="dataService.getMessage()" (childEvent)="dataService.setMessage($event)"></app-child>
`
})
export class ParentComponent {
constructor(private dataService: DataService) {}
}
import { Component, Input, Output, EventEmitter, Inject } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-child',
template: `
<p>Message: {{ message }}</p>
<button (click)="emitChildEvent()">Send event to parent</button>
`
})
export class ChildComponent {
@Input() message: string;
@Output() childEvent = new EventEmitter<string>();
constructor(private dataService: DataService) {}
emitChildEvent() {
this.childEvent.emit('Hello from child!');
}
}
上記の例では、DataService
サービスを使用して、親コンポーネントと子コンポーネント間でメッセージを共有しています。
上記以外にも、Angular 2 で子コンポーネントから親コンポーネントのプロパティを更新する方法があります。
- ViewChild を使用する: ViewChild を使用して、子コンポーネントのインスタンスに直接アクセスし、そのプロパティを更新することができます。
- ngOnChanges ライフサイクルフックを使用する: ngOnChanges ライフサイクルフックを使用して、親
Angular 2 で子コンポーネントから親コンポーネントのプロパティを更新するサンプルコード
Input と Output を使用する
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-parent',
template: `
<app-child [message]="message" (childEvent)="onChildEvent($event)"></app-child>
<p>親コンポーネントのプロパティ: {{ parentProperty }}</p>
`
})
export class ParentComponent {
message = 'Hello from parent!';
parentProperty = '初期値';
onChildEvent(event) {
this.parentProperty = event;
}
}
import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<p>メッセージ: {{ message }}</p>
<button (click)="emitChildEvent()">イベントを親コンポーネントに送信</button>
`
})
export class ChildComponent {
@Input() message: string;
@Output() childEvent = new EventEmitter<string>();
emitChildEvent() {
this.childEvent.emit('新しい値');
}
}
この例では、以下の処理が行われます。
- 親コンポーネントは、
message
プロパティを子コンポーネントにバインドします。 - 子コンポーネントには、
emitChildEvent
というイベントがあります。 - 親コンポーネントは、
onChildEvent
メソッドを使用してchildEvent
イベントをリッスンします。 onChildEvent
メソッドは、親コンポーネントのparentProperty
プロパティをイベントペイロードに更新します。
サービスを使用する
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class DataService {
message = 'Hello from service!';
getMessage() {
return this.message;
}
setMessage(message: string) {
this.message = message;
}
}
import { Component, Inject } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-parent',
template: `
<app-child [message]="dataService.getMessage()" (childEvent)="dataService.setMessage($event)"></app-child>
<p>親コンポーネントのプロパティ: {{ dataService.getMessage() }}</p>
`
})
export class ParentComponent {
constructor(private dataService: DataService) {}
}
import { Component, Input, Output, EventEmitter, Inject } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-child',
template: `
<p>メッセージ: {{ message }}</p>
<button (click)="emitChildEvent()">イベントを親コンポーネントに送信</button>
`
})
export class ChildComponent {
@Input() message: string;
@Output() childEvent = new EventEmitter<string>();
constructor(private dataService: DataService) {}
emitChildEvent() {
this.dataService.setMessage('新しい値');
}
}
- 親コンポーネントは、
DataService
をインジェक्टします。 - 親コンポーネントは、
dataService.getMessage()
を使用してサービスのメッセージを取得し、子コンポーネントにバインドします。 - 子コンポーネントは、メッセージを表示します。
- 子
Angular 2 で子コンポーネントから親コンポーネントのプロパティを更新するその他の方法
ViewChild を使用する
import { Component, ViewChild } from '@angular/core';
import { ChildComponent } from './child.component';
@Component({
selector: 'app-parent',
template: `
<app-child #child></app-child>
<button (click)="updateParentProperty()">親コンポーネントのプロパティを更新</button>
`
})
export class ParentComponent {
@ViewChild('child') child: ChildComponent;
parentProperty = '初期値';
updateParentProperty() {
this.parentProperty = '更新された値';
this.child.updateMessage('親コンポーネントから更新されました');
}
}
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<p>メッセージ: {{ message }}</p>
`
})
export class ChildComponent {
@Input() message: string;
updateMessage(message: string) {
this.message = message;
}
}
- 親コンポーネントは、
ViewChild
ディレクティブを使用して、child
という名前のローカル変数に子コンポーネントのインスタンスを格納します。 - 親コンポーネントには、
updateParentProperty
というメソッドがあります。 updateParentProperty
メソッドは、child.updateMessage
メソッドを使用して子コンポーネントのmessage
プロパティを更新します。- 子コンポーネントの
updateMessage
メソッドは、message
プロパティを親コンポーネントから渡された値に更新します。
ngOnChanges ライフサイクルフックを使用する
ngOnChanges ライフサイクルフックを使用して、親コンポーネントから渡された入力プロパティの変更を検出することができます。その後、子コンポーネントは、これらの変更に応じて親コンポーネントのプロパティを更新することができます。
import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<p>メッセージ: {{ message }}</p>
`
})
export class ChildComponent implements OnChanges {
@Input() message: string;
ngOnChanges(changes: SimpleChanges) {
if (changes.message) {
this.updateParentProperty();
}
}
updateParentProperty() {
// 親コンポーネントのプロパティを更新するロジック
}
}
ngOnChanges
メソッドは、SimpleChanges
オブジェクトを受け取ります。このオブジェクトには、コンポーネントに入力プロパティの変更が含まれます。ngOnChanges
メソッドは、message
入力プロパティの変更をチェックします。message
入力プロパティが変更された場合、updateParentProperty
メソッドが呼び出されます。
RxJS を使用する
RxJS は、Reactive Extensions for JavaScript の略称で、非同期イベントを処理するためのライブラリです。RxJS を使用して、子コンポーネントから親コンポーネントにイベントを発行し、親コンポーネントはこれらのイベントを購読して、子コンポーネントのプロパティを更新することができます。
angular typescript angular2-inputs