RxJS是否有combineSoonest等效操作符?支持任一Observable触发即发射值
解决方案:实现表单状态的即时合并判断
你可以通过给每个表单的statusChanges Observable添加startWith操作符,配合combineLatest来实现需求。startWith会让Observable在初始化阶段就发射指定的初始值,无需等待表单被触碰后才触发合并逻辑。
修改后的代码示例
import { combineLatest } from 'rxjs'; import { startWith, map } from 'rxjs/operators'; combineLatest([ this.nameForm.statusChanges.pipe(startWith(this.nameForm.status)), this.addressForm.statusChanges.pipe(startWith(this.addressForm.status)), ]).pipe( map(([nameStatus, addressStatus]) => { const nameIsValid = nameStatus === 'VALID'; const addressIsValid = addressStatus === 'VALID'; return nameIsValid && addressIsValid; }), ).subscribe((isValid) => { this._showSaveButton(isValid); });
逻辑说明
startWith(this.nameForm.status)会立即发射表单的当前初始状态(比如默认的VALID或INVALID),规避了原combineLatest需要等待两个表单都触发状态变化的问题。- 初始化阶段
combineLatest就能拿到两个表单的状态,之后只要任一表单状态变更,就会重新计算是否显示保存按钮。 - 原代码中
status === undefined的判断可以移除,因为startWith已确保Observable一定会发射初始状态,不会出现undefined的情况。
内容的提问来源于stack exchange,提问作者cadesalaberry
相关产品推荐
相关产品推荐

