1. ホーム
  2. javascript

[解決済み] Angular2でサービス上のイベントを購読するには?

2022-08-02 19:20:59

質問

EventEmitterでイベントを発生させる方法は知っています。また、このようなコンポーネントがあれば、呼び出されるメソッドを添付することができます。

<component-with-event (myevent)="mymethod($event)" />

このようなコンポーネントがある場合、すべてがうまく機能します。私はいくつかのロジックをサービスに移動し、サービス内部からイベントを発生させる必要があります。私がしたことは、これです。

export class MyService {
  myevent: EventEmitter = new EventEmitter();

  someMethodThatWillRaiseEvent() {
    this.myevent.next({data: 'fun'});
  }
}

このイベントに基づいて値を更新する必要があるコンポーネントがあるのですが、うまく動作しないようです。私が試したのはこれです。

//Annotations...
export class MyComponent {
  constructor(myService: MyService) {
    //myService is injected properly and i already use methods/shared data on this.
    myService.myevent.on(... // 'on' is not a method <-- not working
    myService.myevent.subscribe(.. // subscribe is not a method <-- not working
  }
}

イベントを発生させたサービスがコンポーネントでない場合、MyComponentにイベントを購読させるにはどうすればよいですか?

私は、On 2.0.0-alpha.28にいます。

EDIT: 私の "working example" が実際に動作するように修正しましたので、動作しない部分に焦点を当てることができます ;)

コード例です。 http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv

どのように解決するのですか?

更新 : この問題を解決するために、EventEmitterではなく、BehaviorSubjectまたはObservableを使用する、より良い/適切な方法を見つけました。この回答を参照してください。 https://stackoverflow.com/a/35568924/215945

また、Angular のドキュメントには、現在 を使用したクックブックの例もあります。 .


オリジナル/古い/間違った回答です。 また サービス内でEventEmitterを使用しないでください。 . これはアンチパターンです。

beta.1を使って... NavServiceはEventEmiterを含んでいます。 Component Navigationはこのサービスを介してイベントを発行し、コンポーネントObservingComponentはそのイベントを購読します。

nav.service.ts

import {EventEmitter} from 'angular2/core';
export class NavService {
  navchange: EventEmitter<number> = new EventEmitter();
  constructor() {}
  emitNavChangeEvent(number) {
    this.navchange.emit(number);
  }
  getNavChangeEmitter() {
    return this.navchange;
  }
}

コンポーネント.ts

import {Component} from 'angular2/core';
import {NavService} from '../services/NavService';

@Component({
  selector: 'obs-comp',
  template: `obs component, item: {{item}}`
})
export class ObservingComponent {
  item: number = 0;
  subscription: any;
  constructor(private navService:NavService) {}
  ngOnInit() {
    this.subscription = this.navService.getNavChangeEmitter()
      .subscribe(item => this.selectedNavItem(item));
  }
  selectedNavItem(item: number) {
    this.item = item;
  }
  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

@Component({
  selector: 'my-nav',
  template:`
    <div class="nav-item" (click)="selectedNavItem(1)">nav 1 (click me)</div>
    <div class="nav-item" (click)="selectedNavItem(2)">nav 2 (click me)</div>
  `,
})
export class Navigation {
  item = 1;
  constructor(private navService:NavService) {}
  selectedNavItem(item: number) {
    console.log('selected nav item ' + item);
    this.navService.emitNavChangeEvent(item);
  }
}

プランカー