Angular の子コントローラーから親スコープにアクセスする

Rana Hasnain Khan 2024年2月15日
Angular の子コントローラーから親スコープにアクセスする

Angular の子コントローラーから親スコープにアクセスする方法を紹介します。

Angular の子コントローラーから親スコープにアクセスする

コンポーネントベースのライブラリまたはフレームワークで作業する場合、2つのコンポーネント間でデータを共有する必要があるシナリオがたくさんあります。

まず、users コンポーネントを作成します。

# angular CLI
ng g c users

上記のコマンドは、新しい users コンポーネントを生成します。

app フォルダー内に新しい users フォルダーがあることがわかります。users コンポーネントを表示するには、user.component.ts で設定された users selector を使用する必要があります。

それでは、app コンポーネント内に users コンポーネントを表示しましょう。まず、app.module.tsdeclarationsUsersComponent を追加する必要があります。

したがって、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>

出力:

子コンポーネントで p を 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"
}

コードにあるように、dataUser 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.htmlapp-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 Hasnain Khan avatar Rana Hasnain Khan avatar

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

関連記事 - Angular Scope