基本上我想知道有没有办法在订阅之后立即从 EventEmmiter 获取最后一个值?

为什么我需要这个 . 想象一下列表组件使用另外两个组件:过滤器和网格 . 过滤器提供 filter 事件,网格提供 sorting 事件 .

在我的列表组件中,我想编写如下代码:

Observable
            .combineLatest(filtering$, sorting$)
            .switchMap(([filter, sorting]) => {
                return this.api.list(filter, sorting);
            })
            ...

很短的优雅代码 . 但是有两个问题:

  • EventEmitter is not observable . 这不是什么大问题,因为我可以轻松地用可观察的方式包装它 .

  • 在每个可观察者至少发射一次之前,不会执行对API的调用 . 这是一个真正的问题 .

目前我正在使用来自RxJs的BehaviorSubject来解决它:

表示随时间变化的值 . 观察者可以订阅主题以接收最后(或初始)值以及所有后续通知 .

在我的过滤器组件中,我有:

class UsersListFilter {
    private filteringSource = new BehaviorSubject<UserFilter>(new UserFilter());
    filtering$ = this.filteringSource.asObservable();

    ...
}

在我的列表组件中:

class UsersList {
    @ViewChild(UsersListFilter) private filter: UsersListFilter;
    ...

    setupDataReloading() {
        Observable
            .combineLatest(this.filter.filtering$, this.grid.sorting$)
            ...
    }
}

如你所见,我根本不使用 EventEmitter . 但是这个解决方案在Angular2中感觉有点不自然,因为我忽略了与子组件交互的标准方式(@Output) .

有什么想法吗?