Angular で子を表示

Rana Hasnain Khan 2023年1月30日
  1. Angular の DOM 要素で ViewChild を使用する
  2. Angular の子コンポーネントで ViewChild を使用する
Angular で子を表示

@ViewChild は、最も一般的に使用される Angular のデコレータです。これは、Angular を学習しているときに遭遇した最初のデコレーターの 1つです。

@ViewChild には、このチュートリアルで説明する多くの機能があり、各ユースケースの実用的な例があります。

@ViewChild は、ビュークエリを構成するプロパティデコレータです。ビューDOM が変更され、新しい子がセレクターと一致すると、プロパティが更新されます。

ディレクティブ、DOM 要素、および子コンポーネントで@ViewChild を使用できます。例では、@ViewChild を使用する方法を理解できます。

次のコマンドを使用して、新しいアプリケーションを作成しましょう。

# angular
ng new my-app

新しいアプリケーションを Angular で作成した後、このコマンドを使用してアプリケーションディレクトリに移動します。

# angular
cd my-app

それでは、アプリを実行して、すべての依存関係が正しくインストールされているかどうかを確認しましょう。

# angular
ng serve --open

ディレクティブ LanguageDirective を作成しましょう。このディレクティブは、属性 appLanguage を持つ要素を検索し、要素内のテキストの前に Language という単語を追加します。

@angular/cli を使用してディレクティブを生成する方法と、ファイル language.directive.ts を作成する方法は 2つあります。

# Angular
ng generate directive language --skip-tests

このコマンドは、language.directive.ts ファイルを作成し、ディレクティブを app.module.ts ファイルに追加します。そして、ElementRefRenderer2 を使用してテキストを書き直します。

したがって、language.directive.ts のコードは次のようになります。

# angular
import {
  Directive,
  ElementRef,
  Renderer2
} from '@angular/core';

@Directive(
  { selector: '[appLanguage]' }
)
export class LanguageDirective {
  language = 'NodeJs';

  constructor(elem: ElementRef, renderer: Renderer2) {
    let language = renderer.createText('Language ');
    renderer.appendChild(elem.nativeElement, language);
  }
}

また、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 { LanguageDirective } from './language.directive';

@NgModule({
  imports: [BrowserModule, FormsModule],
  declarations: [AppComponent, HelloComponent, LanguageDirective],
  bootstrap: [AppComponent],
})
export class AppModule {}

コンポーネントテンプレートのテキストを含む liappLanguage 属性を追加します。したがって、app.component.html のコードは次のようになります。

# Angular
<h2>Programming Languages</h2>
<ul>
  <li appLanguage>Angular</li>
  <li appLanguage>React</li>
  <li appLanguage>React Native</li>
</ul>

出力:

ディレクティブを使用した Angular のある viewchild

要素のコンテンツの前にある Language という単語は、LanguageDirective のインスタンス変数にアクセスし、その値で extraLanguage インスタンス変数を設定することもできます。

したがって、app.component.ts のコードは次のようになります。

# Angular
import { Component, ViewChild, AfterViewInit } from '@angular/core';
import { LanguageDirective } from './language.directive';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewInit {
  extraLanguage!: string;

  @ViewChild(LanguageDirective)
  set appLanguage(directive: LanguageDirective) {
    this.extraLanguage = directive.language;
  }

  ngAfterViewInit() {
    console.log(this.extraLanguage); // NodeJs
  }
}

上記のコードでセッターを使用して、extraLanguage 変数を設定しました。

これで、最初のビューがロードされた後に子コンポーネントとディレクティブが使用可能になるため、AfterViewInit ライフサイクルフックが変数にアクセスするのを待つことに気付くでしょう。

出力:

ディレクティブコンソールの結果を使用した Angular のある viewchild

上記の出力は、親コンポーネントが@ViewChild を使用してディレクティブから値にアクセスできることを示しています。

Angular の DOM 要素で ViewChild を使用する

この例では、DOM 要素を調べ、@ViewChild を使用してそれらにアクセスします。 @ViewChild を使用すると、テンプレート参照変数を使用してネイティブ DOM 要素にアクセスできます。

次のコマンドを使用して、新しいアプリケーションを作成しましょう。

# angular
ng new my-app

新しいアプリケーションを Angular で作成した後、このコマンドを使用してアプリケーションディレクトリに移動します。

# angular
cd my-app

それでは、アプリを実行して、すべての依存関係が正しくインストールされているかどうかを確認しましょう。

# angular
ng serve --open

たとえば、app.component.html に入力タグがあり、以下のコードに示す #forViewChild 参照変数があります。

# Angular
<input #forViewChild placeholder="Your favorite Programming Language">

また、app.component.css に CSS を追加します。

# Angular
p {
  font-family: Lato;
}
input {
  padding: 5px 10px;
}
label {
  font-size: 20px;
  padding-right: 10px;
}

出力:

DOM 要素と Angular のある viewchild

これで、@ViewChild を使用して入力にアクセスし、値を設定できます。app.component.ts のコードは次のようになります。

# angular
import { Component, ViewChild, AfterViewInit, ElementRef } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewInit {
  @ViewChild('forViewChild') forViewChild!: ElementRef;
  ngAfterViewInit() {
    this.forViewChild.nativeElement.value = 'Angular!';
  }
}

したがって、ngAfterViewInit が実行されると、入力値が変更され、Angular!に設定されます。以下の例に示すように。

出力:

DOM 要素の設定値を使用した Angular の viewchild

上記の例でわかるように、親コンポーネントは@ViewChild を使用して子 DOM 要素の値を設定します。

Angular の子コンポーネントで ViewChild を使用する

@ViewChild を使用すると、子コンポーネントにアクセスして、子が使用できるメソッドまたはインスタンス変数を呼び出すことができます。次に、Angular の子コンポーネントで@ViewChild を使用する方法を理解するための例を見ていきます。

次のコマンドを使用して、新しいアプリケーションを作成しましょう。

# angular
ng new my-app

新しいアプリケーションを Angular で作成した後、このコマンドを使用してアプリケーションディレクトリに移動します。

# angular
cd my-app

それでは、アプリを実行して、すべての依存関係が正しくインストールされているかどうかを確認しましょう。

# angular
ng serve --open

それでは、HelloComponent として新しいコンポーネントを作成しましょう。

新しいコンポーネントは 2つの方法で作成できます。 @angular/cli を使用して、次のコマンドを実行します。

# Angular
ng generate component hello --flat --skip-tests

このコマンドを使用すると、hello.component.tshello.component.html、および hello.component.css ファイルが作成されます。または、これらのファイルを手動で作成することもできます。

ここで、app.module.ts に、新しく作成したコンポーネントを追加する必要があります。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';

@NgModule({
  imports:      [ BrowserModule, FormsModule ],
  declarations: [ AppComponent, HelloComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

メッセージを返すために、GreetingMessage メソッドを HelloComponent に追加します。

# Angular
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'hello',
  templateUrl: './hello.component.html',
  styleUrls: ['./hello.component.css'],
})
export class HelloComponent implements OnInit {
  constructor() {}

  GreetingMessage() {
    return 'Hello Member!';
  }

  ngOnInit(): void {}
}

ここで、<hello> を使用して app.component.html の子コンポーネントを参照します。したがって、コードは次のようになります。

# Angular
<hello>It Works</hello>

親コンポーネントクラス app.component.ts から@ViewChild を使用して GreetingMessage メソッドを呼び出します。したがって、コードは次のようになります。

# Angular
import { Component, ViewChild, AfterViewInit } from '@angular/core';
import { HelloComponent } from './hello.component';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  @ViewChild(HelloComponent) hello!: HelloComponent;

  ngAfterViewInit() {
    console.log(this.hello.GreetingMessage());
  }
}

出力:

子コンポーネントと Angular のある viewchild

このチュートリアルでは、さまざまな状況で@ViewChild を使用する方法を例を挙げて説明しました。

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