我已经通过Observable
按钮事件创建了一个"click"
:
let editClick$ = Observable.fromEvent(this.editButton.nativeElement, 'click');
因此,当单击“编辑”按钮时,表示用户正在编辑:
this.editing$ = editClick$.pipe(map(() => true));
“编辑”按钮时出现问题
false
),或者有什么想法吗?
答案 0 :(得分:1)
返回默认值:
this.editing$.pipe(publishBehavior(), refCount());
它与share()
运算符相似,但是share() === multicast(() => new Subject()).refCount()
我建议您看看这个link。
答案 1 :(得分:0)
我读到您的第二个要求是:“当新订户订阅时,他希望立即获得最新的价值”。然后将这样做:
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
);
如果这不是您的第二个要求,请弄清楚您的用例到底是什么。
答案 2 :(得分:0)
我很高兴选择从fromEvent
中创建一个Observable(建议您显示信号的语法和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)
,以使其更完整。
也许您可以扩展用例,我们可以帮助您确定哪些运算符或它们的组合会有所帮助。
答案 3 :(得分:0)
我猜你不想要startWith(false)因为订阅者可能会得到2个发射,而你只想要1个发射。 怎么样:
this.editing$ = editClick$.pipe(
mapTo(() => true),
defaultIfEmpty(false),
);