我有一个带有子组件查询列表的组件。这些子组件中的每个子组件都公开两种方法,一种返回表单是否有效为observable<boolean>
,另一种返回对象。
在父组件中,我想遍历子组件并检查每个子组件是否有效。我有这样的代码
let valid: boolean = true;
children.forEach(r => {
r.validate().subscribe(v => {
if(!v){
valid = v;
}
});
});
然后在foreach循环之后,如果有效仍然为true,则继续收集对象。但是,我认为这是不正确的,因为foreach循环可能在所有可观察对象都发出值之前完成了,我也不确定将多个订阅分配给同一个变量的影响。
除了简单地使validate()方法返回常规布尔值之外,还有更好的方法吗?像forkjoin这样的东西会更好一些,因为foreach循环会将所有可观察到的对象分叉在一起并发出单个数组?
答案 0 :(得分:4)
您可以使用forkJoin。
所有可观测值完成后,从每个可观测值中发出最后一个发出的值。
import { forkJoin } from 'rxjs/observable/forkJoin';
const allObs = forkJoin(...children.map(r => r.validate()));
allObs.subscribe(res => console.log(res)); // Do what you want with the array of results