Angular の子コントローラーから親スコープにアクセスする
Angular の子コントローラーから親スコープにアクセスする方法を紹介します。
Angular の子コントローラーから親スコープにアクセスする
コンポーネントベースのライブラリまたはフレームワークで作業する場合、2つのコンポーネント間でデータを共有する必要があるシナリオがたくさんあります。
まず、users
コンポーネントを作成します。
# angular CLI
ng g c users
上記のコマンドは、新しい users
コンポーネントを生成します。
app フォルダー内に新しい users フォルダーがあることがわかります。users
コンポーネントを表示するには、user.component.ts
で設定された users selector
を使用する必要があります。
それでは、app
コンポーネント内に users
コンポーネントを表示しましょう。まず、app.module.ts
の declarations
に UsersComponent
を追加する必要があります。
したがって、app.module.ts
は次のようになります。
# angular
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { UsersComponent } from './users/users.component';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, HelloComponent, UsersComponent],
bootstrap: [ AppComponent ]
})
export class AppModule { }
app.component.html
にユーザーセレクターを使用してタグを作成する必要があります。これにより、users.component.html
に追加したものがすべて表示されます。app.component.html
のコードは次のようになります。
# angular
<hello name="{{ name }}"></hello>
<p>Start editing to see some magic happen :)</p>
<app-users></app-users>
出力:
写真のように、app-users
タグには users works!
が表示されています。なぜなら、users.component.html
には次のコードがあるからです。
# angular
<p>users works!</p>
それを見出しに変換して、親コンポーネントからデータを送信しましょう。
まず、<p>
タグを <h3>
に変更します。
# angular
<h3>Child Component</h3>
出力:
親コンポーネントから子コンポーネントに単純なデータを送信します。app.component.ts
ファイル内で変数を定義するので、コードは以下のようになります。
# angular
import { Component, VERSION } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular ' + VERSION.major;
data = "User Name"
}
コードにあるように、data
に User Name
を代入しました。この data
を子コンポーネントに送信してみましょう。これで、app.component.html
は以下のようになります。
# angular
<hello name="{{ name }}"></hello>
<p>Start editing to see some magic happen :)</p>
<app-users [data] = "data"></app-users>
[data]
を変数 data
にバインドすることで、子コンポーネントにデータを送信しますが、まだ完全にはバインドされていません。
users.component.ts
ファイルに input
をインポートする必要があります。input
は、子コンポーネントに送信したデータを読み取り、子コンポーネントに表示するデコレータです。
UsersComponent
クラス内で、app-users
タグ内の app.component.html
でバインドしたプロパティを読み取ります。したがって、users.component.ts
のコードは次のようになります。
# angular
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'app-users',
templateUrl: './users.component.html',
styleUrls: ['./users.component.css']
})
export class UsersComponent implements OnInit {
@Input() data
constructor() { }
ngOnInit() {
}
}
コードに示されているように、@Input() data
を使用して、app.component.html
の app-users
タグから [data]
をバインドしました。受け取ったデータを users.component.html
ファイル内に表示します。
# angular
<h3>Child Component</h3>
<h4>Data Recieved:</h4>
<p>{{data}}</p>
出力:
親コンポーネントから子コンポーネントにデータを受け取りました。次に、オブジェクトを親から子に共有する方法について説明します。
送信するデータを変更して、オブジェクトを共有してみましょう。
# angular
data = {
name: 'Rana Hasnain',
age: 25
}
出力:
そのオブジェクトからのデータの代わりに [オブジェクトオブジェクト]
を表示していることがわかります。ここで行う必要があるのは、users.component.html
ファイルのコードを変更し、{{data}}
を {{data.name}}
または {{data.age}}
に変更することです。オブジェクトが表示されます。
# angular
<h3>Child Component</h3>
<h4>Data Received:</h4>
<p>Name: {{ data.name }}</p>
<p>Age: {{ data.age }}</p>
出力:
これで、親コンポーネントから子コンポーネントにデータとオブジェクトを共有したことがわかります。
Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.
LinkedIn関連記事 - Angular Controller
- AngularJS における Controller as Syntax の使用方法
- AngularJS の 1 ページに複数のコントローラーを作成する
- AngularJS のコントローラー間でデータを共有する