我从"click"
按钮事件创建了一个Observable
:
let editClick$ = Observable.fromEvent(this.editButton.nativeElement, 'click');
因此,当单击"编辑"按钮时,表示用户正在编辑:
this.editing$ = editClick$.pipe(map(() => true));
"编辑"按钮时出现问题
- 尚未单击(默认值必须为
false
),或 - 订阅者应收到上次发出的值。
有什么想法吗?
为了使默认值返回:
this.editing$.pipe(publishBehavior(), refCount());
它类似于share()
运算符,但share() === multicast(() => new Subject()).refCount()
我建议你看看这个链接。
我把你的第二个要求解读为"当新订阅者订阅时,他希望立即获得最新值"。这将做到这一点:
this.editing$ = editClick$.pipe(
map(() => true),
startWith(false), // <- this will be the starting value
shareReplay(1) // <- the last emitted value will be saved and emitted immediately when a new subscriber subscribes
);
如果这不是您的第二个要求,请澄清您的用例到底是什么。
我对你选择创建一个fromEvent
外的可观察对象感到非常满意(请注意,你显示的语法是信号和旧版(已弃用的)RxJS,你运行的是什么版本?我将使用最新版本作为我的示例)
我想对于你的第一个问题,你会想要startWith()
.
https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/startWith.ts
您将像这样使用它:
fromEvent(this.editButton.nativeElement, 'click').pipe(
map(() => true),
startWith(false)
)
第二个问题有点复杂,因为默认情况下fromEvent()
Observable
不会complete
。这为您提供了几个选项,这在很大程度上取决于您的用例。
想到的运算符:take(x)
其中 x 是要接受的值的数量。如果这是第一个值,则first()
也可以工作。
debounceTime(ms)
,缓冲所有输入,仅在去抖动毫秒后发出。您可以在之后组合添加take(1)
以使其完成后完成。
也许如果您可以扩展您的用例,我们可以帮助您确定哪些运算符或这些运算符的组合会有所帮助。
我猜你不想要 startWith(false),因为订阅者可能会得到 2 次发射,而你只需要 1 次发射。 这个怎么样:
this.editing$ = editClick$.pipe(
mapTo(() => true),
defaultIfEmpty(false),
);