【发布时间】:2019-07-15 12:43:12
【问题描述】:
valueChanges 存在于 FormControl 对象上的 Observable 每次在 FormControl 对象上调用 setValue(value) 函数时都会发出值。
使用 RxJS 运算符 distinctUntilChanged 我们可以过滤掉不是新的值。但是如果 FormControl 有初始值,这不起作用。
const formGroup1 = new FormGroup({page: new FormControl(1)});
const formControl1 = formGroup1.get('page');
formControl1.valueChanges.pipe(distinctUntilChanged())
.subscribe(v => console.log(`new formControl1 value: ${v}`));
formControl1.setValue(1);
formControl1.setValue(2);
这将记录
> new form1Control value: 1
> new form1Control value: 2
1 是 valueChanges Observable 发出的第一个值,因为 formControl1 值是在创建 valueChanges Observable 之前设置的。
distinctUntilChanged 从不过滤掉第一个发出的值
这是解决此问题的一种方法:
const formGroup2 = new FormGroup({page: new FormControl(1)});
const formControl2 = formGroup2.get('page');
formControl2.valueChanges.pipe(
startWith(1),
distinctUntilChanged(),
skip(1)
).subscribe(v => console.log(`new formControl2 value: ${v}`));
formControl2.setValue(1);
formControl2.setValue(2);
在这里,我通过发出 FormControl 初始值然后跳过它来修改 valueChanges Observable。所以第一次调用distinctUntilChanged,也就是line:
formControl2.setValue(1)
它已经有previousValue(1)来比较新值,所以订阅里面的函数不会被执行。
但我不太喜欢这种解决方案。 Angular7 和 RxJS6 中是否有内置或推荐的方法来处理 FormControl 值的变化?
stackblitz:https://stackblitz.com/edit/angular-arevmw?file=app%2Ficon-overview-example.ts
【问题讨论】:
标签: javascript angular rxjs angular-reactive-forms rxjs6