具有角度服务的EventEmitter或RxJS主题

时间:2017-09-01 07:05:13

标签: angular angular-services angular-components

  1. EventEmitter是否为RxJS Observable?
  2. 在角度文档中,它解释了如何进行通信 使用EventEmitter将子组件转换为父组件。我们应该使用吗? EventEmitter只在组件中或它可以使用角度服务 也?
  3. 在角度文档中,它解释了父和子如何通过使用的共享服务进行通信 可观察的RxJS主题。我们可以使用EventEmitter而不是RxJS 这个MissionService示例中的主题?如果我们可以在服务中使用EventEmitter,请使用EventEmitter帮助转换此示例。我是棱角分明的新人。

    https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service

  4. 阅读这些相关帖子后我有点困惑:

2 个答案:

答案 0 :(得分:1)

EventEmiter是RxJs主题的扩展,您可以将其用作Observable。

Angular sources

    export declare class EventEmitter<T> extends Subject<T> {
      __isAsync: boolean;
      constructor(isAsync?: boolean);
      emit(value?: T): void;
      subscribe(generatorOrNext?: any, error?: any, complete?: any): any;
    }

在父组件和子组件之间共享数据的最佳做法是使用@Input和@Output

当您需要使用服务进行共享时。您需要使用Subject或BehaviorSubject

服务示例

@Injectable()
export class MyService {
  private data: BehaviorSubject<MyData> = new BehaviorSubject(null);

  getData(): Observable<MyData> {
    return this.data;
  }

  setData(d: MyData): void {
    this.data.next(d);
  }
}

在组件中使用

data: Observable<MyData>;

constructor(private myService: MyService) {}

ngOnInit() {
   this.data = this.myService.getData();
}

在模板中使用

<div>{{data|async}}</div>

答案 1 :(得分:-1)

处理事件场景的方法有很多种。

EventEmitter是将子事件传递给父级的最常用方法。假设您创建了一个子组件并在那里单击了一个按钮,您可能希望在父组件中单击该事件:

<button (click)="clickEmitter.emit()">button</button>

<child-component (clickEmitter)="buttonClicked()"></child-component>

共享服务(Injectable)可用于存储多个组件的数据。

Subject和BehaviorSubject可用于在组件之间共享事件(有时通过共享服务)。例如:我使用了一个带有用户BehaviorSubject的authService来获取每个组件中的登录用户对象。

这些只是许多其他用例中的一些简单示例。