Angular: オブジェクト、サービス、Subject、NgRxを使ってデータを共有する

2024-04-09

AngularでEventEmitterに2つのパラメータを渡す方法

オブジェクトとして渡す

最も簡単な方法は、2つのパラメータをオブジェクトとしてまとめ、EventEmitterに渡す方法です。

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

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  public myEventEmitter = new EventEmitter<object>();

  constructor() {}

  ngOnInit(): void {}

  public emitEvent(): void {
    const data = {
      param1: 'value1',
      param2: 'value2',
    };

    this.myEventEmitter.emit(data);
  }
}

上記コードでは、MyComponentクラスにmyEventEmitterという名前のEventEmitterを定義しています。emitEventメソッドでは、param1param2という2つのパラメータを持つオブジェクトを作成し、myEventEmitterに渡しています。

受信側では、以下のコードのように、EventEmitterからemitされるオブジェクトを受け取ることができます。

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

@Component({
  selector: 'my-other-component',
  templateUrl: './my-other-component.component.html',
})
export class MyOtherComponent implements OnInit {
  constructor() {}

  ngOnInit(): void {}

  public onEvent(data: object): void {
    console.log(data['param1']); // 'value1'
    console.log(data['param2']); // 'value2'
  }
}

上記コードでは、MyOtherComponentクラスでmyEventEmitterからemitされるイベントをonEventメソッドで受け取っています。onEventメソッドでは、イベントオブジェクトからparam1param2パラメータの値を出力しています。

複数のEventEmitterを使用する

2つのパラメータをそれぞれ個別のEventEmitterに渡す方法もあります。

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

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  public param1EventEmitter = new EventEmitter<string>();
  public param2EventEmitter = new EventEmitter<string>();

  constructor() {}

  ngOnInit(): void {}

  public emitEvent(): void {
    this.param1EventEmitter.emit('value1');
    this.param2EventEmitter.emit('value2');
  }
}

上記コードでは、MyComponentクラスにparam1EventEmitterparam2EventEmitterという2つのEventEmitterを定義しています。emitEventメソッドでは、それぞれのパラメータを個別にEventEmitterにemitしています。

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

@Component({
  selector: 'my-other-component',
  templateUrl: './my-other-component.component.html',
})
export class MyOtherComponent implements OnInit {
  constructor() {}

  ngOnInit(): void {}

  public onParam1Event(param1: string): void {
    console.log(param1); // 'value1'
  }

  public onParam2Event(param2: string): void {
    console.log(param2); // 'value2'
  }
}

上記コードでは、MyOtherComponentクラスでparam1EventEmitterparam2EventEmitterからemitされるイベントをそれぞれonParam1EventonParam2Eventメソッドで受け取っています。

カスタムイベントクラスを使用する

より複雑なデータ構造を渡したい場合は、カスタムイベントクラスを作成する方法もあります。

export class MyCustomEvent {
  constructor(public param1: string, public param2: string) {}
}
import { Component, OnInit } from '@angular/core';
import { EventEmitter } from '@angular/core';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  public myEventEmitter = new EventEmitter<



オブジェクトとして渡す

<button (click)="emitEvent()">イベントを発火</button>

my-component.component.ts

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

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  public myEventEmitter = new EventEmitter<object>();

  constructor() {}

  ngOnInit(): void {}

  public emitEvent(): void {
    const data = {
      param1: 'value1',
      param2: 'value2',
    };

    this.myEventEmitter.emit(data);
  }
}
<p>パラメータ1: {{ data.param1 }}</p>
<p>パラメータ2: {{ data.param2 }}</p>

<my-component (myEventEmitter)="onEvent($event)"></my-component>
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'my-other-component',
  templateUrl: './my-other-component.component.html',
})
export class MyOtherComponent implements OnInit {
  constructor() {}

  ngOnInit(): void {}

  public onEvent(data: object): void {
    console.log(data['param1']); // 'value1'
    console.log(data['param2']); // 'value2'
  }
}

複数のEventEmitterを使用する

<button (click)="emitEvent()">イベントを発火</button>
import { Component, OnInit } from '@angular/core';
import { EventEmitter } from '@angular/core';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  public param1EventEmitter = new EventEmitter<string>();
  public param2EventEmitter = new EventEmitter<string>();

  constructor() {}

  ngOnInit(): void {}

  public emitEvent(): void {
    this.param1EventEmitter.emit('value1');
    this.param2EventEmitter.emit('value2');
  }
}
<p>パラメータ1: {{ param1 }}</p>
<p>パラメータ2: {{ param2 }}</p>

<my-component (param1EventEmitter)="onParam1Event($event)" (param2EventEmitter)="onParam2Event($event)"></my-component>
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'my-other-component',
  templateUrl: './my-other-component.component.html',
})
export class MyOtherComponent implements OnInit {
  constructor() {}

  ngOnInit(): void {}

  public onParam1Event(param1: string): void {
    console.log(param1); // 'value1'
  }

  public onParam2Event(param2: string): void {
    console.log(param2); // 'value2'
  }
}

カスタムイベントクラスを使用する

my-custom-event.ts

export class MyCustomEvent {
  constructor(public param1: string, public param2: string) {}
}
import { Component, OnInit } from '@angular/core';
import { EventEmitter } from '@angular/core';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  public myEventEmitter = new EventEmitter<MyCustomEvent>();

  constructor() {}

  ngOnInit(): void {}

  public emitEvent(): void {
    const event = new MyCustomEvent('value1', 'value2');
    this.myEventEmitter.emit(event);
  }
}
<p>パラメータ1: {{ event.param1 }}</p>



AngularでEventEmitterに2つのパラメータを渡す方法

サービスを使用して、コンポーネント間でデータを共有する方法があります。

my-service.ts

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

@Injectable({
  providedIn: 'root',
})
export class MyService {
  constructor() {}

  private data: object;

  public setData(param1: string, param2: string): void {
    this.data = {
      param1,
      param2,
    };
  }

  public getData(): object {
    return this.data;
  }
}
import { Component, OnInit } from '@angular/core';
import { MyService } from './my-service';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  constructor(private myService: MyService) {}

  ngOnInit(): void {}

  public emitEvent(): void {
    this.myService.setData('value1', 'value2');
  }
}
import { Component, OnInit } from '@angular/core';
import { MyService } from './my-service';

@Component({
  selector: 'my-other-component',
  templateUrl: './my-other-component.component.html',
})
export class MyOtherComponent implements OnInit {
  constructor(private myService: MyService) {}

  ngOnInit(): void {}

  public getData(): object {
    return this.myService.getData();
  }
}

Subjectを使用する

Subjectは、複数のコンポーネント間でデータを共有するためのRxJSの機能です。

import { Component, OnInit } from '@angular/core';
import { Subject } from 'rxjs';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  public mySubject = new Subject<object>();

  constructor() {}

  ngOnInit(): void {}

  public emitEvent(): void {
    const data = {
      param1: 'value1',
      param2: 'value2',
    };

    this.mySubject.next(data);
  }
}
import { Component, OnInit } from '@angular/core';
import { Subject } from 'rxjs';

@Component({
  selector: 'my-other-component',
  templateUrl: './my-other-component.component.html',
})
export class MyOtherComponent implements OnInit {
  constructor() {}

  ngOnInit(): void {}

  public getData(): Subject<object> {
    return this.mySubject;
  }
}

NgRxを使用する

NgRxは、Angularアプリケーションで状態管理を行うためのライブラリです。

import { Component, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent implements OnInit {
  constructor(private store: Store) {}

  ngOnInit(): void {}

  public emitEvent(): void {
    const data = {
      param1: 'value1',
      param2: 'value2',
    };

    this.store.dispatch(new MyAction(data));
  }
}
import { Component, OnInit } from '@angular/core

angular eventemitter


Angular 2 での画像URL検証:XMLHttpRequest、Imageオブジェクト、Service Worker、ライブラリ徹底比較

画像URLが有効かどうかを確認するには、いくつかの方法があります。以下に、そのうちの2つの一般的な方法をご紹介します。XMLHttpRequestを使用して、画像URLに対するHEADリクエストを送信できます。HEADリクエストは、画像の実際のコンテンツを取得せずに、画像に関するヘッダー情報のみを取得します。ステータスコードが200であれば、画像URLは有効です。それ以外の場合は、画像URLは破損している可能性があります。...


Angular初心者でも安心!ng-srcの代替方法を分かりやすく解説

最も簡単な方法は、[src] バインディングを使用することです。これは、テンプレート内の要素の src 属性をコンポーネントクラスのプロパティに直接バインドします。この方法はシンプルで分かりやすいですが、動的に画像パスを変更したい場合は、コンポーネントクラスのプロパティを更新する必要があります。...


TypeScriptで型安全性を高めるためのベストプラクティス

このとき、Person 型は、Person クラスのインスタンスのみを値として持つ型となります。つまり、以下のコードは有効です:一方、any 型は、あらゆる型の値 を持つことができます。つまり、型安全性がない型です。以下のようなコードは有効です:...


Angular2 で 'Can't bind to 'routerLink' since it isn't a known property' エラーを解決する

原因routerLink ディレクティブの誤った使用routerLink にバインドする値の誤りモジュールのインポート漏れルーティング設定の誤り解決方法routerLink ディレクティブは、アンカータグ <a> または <router-link> コンポーネントにのみ使用できます。他の要素にバインドしようとすると、エラーが発生します。...


ngx-mat-table-extensionsを使ってAngular Material 2 DataTableでネストされたオブジェクトをソートする方法

ネストされたオブジェクトでソートするには、以下の方法があります。sortingDataAccessorプロパティは、DataTableコンポーネントにネストされたオブジェクトのソート方法を指示するために使用されます。このプロパティは、関数として定義する必要があります。関数は、ソート対象のオブジェクトとプロパティ名を受け取り、そのプロパティの値を返す必要があります。...