【发布时间】:2020-02-10 15:02:35
【问题描述】:
我有一个具有内部状态的组件,存储在 RxJS BehaviorSubject 中(顺便说一下,包含某个 DOM 元素的大小)。
我想将此状态公开为 @Output() 属性。
我能想到的最天真的实现是这样的:
// inside myComponent
private _state$ = new BehaviorSubject<Something>(...);
@Output() stateChange = new EventEmitter<Something>();
constructor() {
// skipping unsubscription for the sake of this simplistic example
this._state$.subscribe(newState => this.stateChange.emit(newState);
}
但是,一旦有新订阅,这不会像 BehaviorSubject 那样发出当前存储的值。迟到的订阅者不会获得当前值。
对于这种情况有简单的方法吗?我想公开状态并基本上不再担心事件的顺序,就像我使用简单的 BehaviorSubject<T> 一样。
【问题讨论】:
-
暴露
this._state$.asObservable()有问题吗?编辑:我想问题是你想像(stateChange)="onStateChange($event)"一样绑定到它? -
@KurtHamilton 是的,我想使用
(stateChange)语法。而且,我不想关心父组件何时订阅。 -
这是一个相当有趣的问题。在没有一种干净的方式来做到这一点(分叉 EventEmitter 并从 BehaviorSubject 继承的肮脏方式)的情况下,我得出的结论是,混合 javascript 事件处理和 rxjs 的隐喻可能不是一个好习惯(尽管 Angular 是很高兴这样做......现在)。不过我很想看看你最终做了什么,所以如果你想出一个好的解决方案,请通过这个评论链提醒我。