我有一个对象数组,其中对象有一个Observable类型的字段,但还有另一个boolean字段。我想创建一个单一的订阅来监听那些可观察的但是使用布尔字段而不是可观察的值。
更具体地说,我正在使用angular并拥有一个FormControl数组。我正在监听valueChanges事件,但需要使用isValid字段将其映射到布尔数组。
我已经尝试使用combineLatest映射observable,但是当有多个对象时,它永远不会有效。
Observable.combineLatest(this.controls.map(c => c.valueChanges!.map(sc => c.valid))).subscribe(validations => {
console.log('fired');
});
在示例中,'fired'仅在我有一个控件时才会被记录。只要我在列表中添加另一个控件,它就不起作用。
答案 0 :(得分:1)
combineLatest仅在基础Observable的所有至少发出一次时发出(因此,当存在单个FormControl时,您的示例将按预期工作,但在所有FormControl进行状态更改之前不会发生任何事情)
快速解决方法可能是使用startWith:
Observable.combineLatest(
this.controls.map(c => c.valueChanges!.map(sc => c.valid).startWith(true))
).subscribe(validations => {
console.log('fired');
});
请注意,使用此代码,您将获得包含所有验证的单一起始发布true