gpt4 book ai didi

typescript - 具有最后一个值的 Angular2 EventEmitter

转载 作者:行者123 更新时间:2023-12-05 06:42:09 25 4
gpt4 key购买 nike

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

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

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

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

非常简短优雅的代码。但是有两个问题:

  1. EventEmitter is not observable .这不是什么大问题,因为我可以轻松地用 observable 包装它。
  2. 在每个可观察对象至少触发一次之前,不会执行对 API 的调用。这是一个真正的问题。

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

Represents a value that changes over time. Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.

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

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) 交互的标准方式。

有什么想法吗?

最佳答案

改用这个自定义类

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

import { ObjectUnsubscribedError } from 'rxjs';


export class CustomEventEmitter<T> extends EventEmitter<T> {

private _value: T;

constructor() {
super();
}

get value(): T {
return this.getValue();
}

getValue(): T {
if (this.hasError) {
throw this.thrownError;
} else if (this.closed) {
throw new ObjectUnsubscribedError();
} else {
return this._value;
}
}

emit(value?: T) {
super.emit(this._value = value);
}
}

关于typescript - 具有最后一个值的 Angular2 EventEmitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38244800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com