如何将更改对象作为主题发出,并且仅预订一个键更改?

时间:2019-05-06 13:29:40

标签: angular rxjs angular-directive angular-event-emitter

我有一个侧边栏,当您对其进行更改时,我需要订阅这些更改并对它们做出反应,因此我们正在使用主题。

问题是我们不知道主题的最佳架构,应该是发出单个字符串还是对象?

如果我们将所有更改的对象作为key:value对发出,那么我们如何仅在其他位置订阅这些更改之一,而不是对整个对象做出反应?

我想使每次更改都避免由Subject发射器污染我的代码,或者这是“最佳实践”

当前实施示例

发射器

/**
 * A function that emits an RXJS event to any observers subscribed to this subjet
 * when the user changes the calendar in the sidebar.
 * @return {Observable} An Observable that, whenever subscribed, will execute the
 * specified function.
 * @static false
 */
public emitCalendar = (calendar: any): void => {
    this.selectedCalendar = calendar;
    this.onChangeLeftPane$.next({ calendar: calendar });
};

然后,仅订阅的最佳方法是什么

onChangeLeftPane$.calendar

2 个答案:

答案 0 :(得分:0)

设置一个单独的Observable,以使用filter运算符收听更改

    this.onChangeCalendar=this.onChangeLeftPane$.asObservable()
.pipe(filter(obj=>Objects.keys(obj).includes('calendar'))
this.onChangeLeftPane$.next({ calendar: calendar });

答案 1 :(得分:0)

您可以使用pluck仅从对象中获取calendar,然后在必要时添加filter(这样,如果{{1 }}丢失)和/或distinctUntilChanged(这样就不会发出相同的值,如果它没有变化的话)。

undefined

https://stackblitz.com/edit/typescript-eoyqi9