【Angular】サービスクラスを利用してコンポーネント間で値の共有をする

今回はAngularのコンポーネント間での値共有方法の1つであるサービスクラス作って実際に値共有をしていきます。

動きとしては親、子のコンポーネントを用意し、親⇒子、子⇒親への双方向での画面入力値を共有をしたいと思います。

サービスクラスを利用してコンポーネント間で値の共有をする

今回使用した環境

インターネット接続可能のオンラインの環境

64 ビット オペレーティング システム

Windows 10 22H2

Angular CLI: 13.3.10

Node: 16.15.0

ソース

まずはサービスクラス「ParentChildSharedService」です。コンポーネント間で値共有しようとしている変数が「parentValue」、「childValue」となります。

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class ParentChildSharedService {

  parentValue: string = "";
  childValue: string = "";

  constructor() { }
}

続いて親コンポーネントのHTML、クラスです。ngDoCheckのイベントの中で親⇔子の入力値を共有しています。

<p>parent works!</p>
parentコンポーネントからchildコンポーネントに渡す値:
<input type="text" [(ngModel)]="parentValue">
<br />
childコンポーネントからparentコンポーネントに渡された値:
{{childValue}}
<app-child></app-child>
import { Component, OnInit } from '@angular/core';
import { ParentChildSharedService } from '../parent-child-shared.service';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html',
  styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {

  parentValue: string = "";
  childValue: string = "";

  constructor(
    private parentChildSharedService: ParentChildSharedService
  ) { }

  ngOnInit(): void {
  }

  ngDoCheck(): void {
    this.parentChildSharedService.parentValue = this.parentValue;
    this.childValue = this.parentChildSharedService.childValue;
  }
}

以下が子コンポーネントのHTML、クラスです。

<p>child works!</p>
childコンポーネントからparentコンポーネントに渡す値:
<input type="text" [(ngModel)]="childValue">
<br />
parentコンポーネントからchildコンポーネントに渡された値:
{{parentValue}}
import { Component, OnInit } from '@angular/core';
import { ParentChildSharedService } from '../parent-child-shared.service';

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {

  parentValue: string = "";
  childValue: string = "";

  constructor(
    private parentChildSharedService: ParentChildSharedService
  ) { }

  ngOnInit(): void {
  }

  ngDoCheck(): void {
    this.parentValue = this.parentChildSharedService.parentValue;
    this.parentChildSharedService.childValue = this.childValue;
  }
}

動作確認

動かしてみます。画面上側が親コンポーネント、下側に子コンポーネントを表示しています。

親⇒子へ、子⇒親へ入力値が反映されました。

以上となります。

ここまでお読みいただきありがとうございました。

Angular

Posted by だゆう