Rxjs 仅当窗体控件的上一个值为时,才能订阅更改!==formcontrol的当前值
仅当输入/选择的上一个值!=输入/选择的当前值 但是我注意到,每当将光标放在输入字段上时,它仍然调用onDataChange()(但没有更改输入字段的任何值/更改下拉值的选择) 我使用了startWith(null)、pairwise和filter(prev!=next),但它仍然执行onDataChange(),即使上一个值与下一个值相同 主要问题是当将光标放在输入字段上但不更改任何值时,它仍然调用onDataChange() 我只想在输入值发生更改/下拉选择发生更改时调用onDataChange()。onDataChange()将调用api调用,检索结果可能需要更长的时间 有没有人遇到过类似的问题并能提供指导?谢谢 "Rxjs 仅当窗体控件的上一个值为时,才能订阅更改!==formcontrol的当前值,rxjs,observable,angular8,angular-pipe,rxjs-observables,Rxjs,Observable,Angular8,Angular Pipe,Rxjs Observables,仅当输入/选择的上一个值!=输入/选择的当前值 但是我注意到,每当将光标放在输入字段上时,它仍然调用onDataChange()(但没有更改输入字段的任何值/更改下拉值的选择) 我使用了startWith(null)、pairwise和filter(prev!=next),但它仍然执行onDataChange(),即使上一个值与下一个值相同 主要问题是当将光标放在输入字段上但不更改任何值时,它仍然调用onDataChange() 我只想在输入值发生更改/下拉选择发生更改时调用onDataChan
{{type}}
{{unit}
恩戈尼尼特(){
常量值更改:可观察[]=[
此.numberForm.get('dropdown').valueChanges,
this.numberForm.get('onValue').valueChanges,
此.numberForm.get('onValueUnit').valueChanges
].map(obs=>
obs管道(
startWith(null),成对(),
过滤器(([prev,next])=>prev!==next),
)
);
//将所有可观察到的valueChanges合并为一次和去盎司时间,持续250ms,以避免处理
//如果用户在UI中非常快地更改值,则可能会发生快速连续的事件。
合并(…值更改)
.烟斗(
takeUntil(此为ngUnsubscribe),
去BounceTime(此延迟)
)
.订阅(([prev,next]:[any,any])=>{
这个.onDataChange();
});
this.updateValidators();
super.ngOnInit();
}
如果我删除合并并只关注“onValue”的formcontrolname的更改,那么只有当值存在差异时,它才会执行onDataChange()
有没有其他方法可以用来合并这3个formcontrolname,并观察formcontrolname中任何一个的更改?如果理解正确,您希望使用
distinctUntilChanged
操作符,这就是我重构代码的方法:
const valueChanges: Observable<any>[] = [
this.numberForm.get('dropdown').valueChanges,
this.numberForm.get('onValue').valueChanges,
this.numberForm.get('onValueUnit').valueChanges
].map(obs => obs.pipe(startWith(null)));
combineLatest(valueChanges).pipe(
debounceTime(this.delay),
distinctUntilChanged((prev, curr) =>
prev[0] === curr[0] && prev[1] === curr[1] && prev[2] === curr[2]
),
takeUntil(this.ngUnsubscribe),
).subscribe(() => {
this.onDataChange();
});
const valueChanges:Observable[]=[
此.numberForm.get('dropdown').valueChanges,
this.numberForm.get('onValue').valueChanges,
此.numberForm.get('onValueUnit').valueChanges
].map(obs=>obs.pipe(startWith(null));
组合测试(值更改)。管道(
去BounceTime(此延迟),
distinctUntilChanged((上一个,当前)=>
上一个[0]==当前[0]&上一个[1]==当前[1]&当前[2]==当前[2]
),
takeUntil(此为ngUnsubscribe),
).订阅(()=>{
这个.onDataChange();
});
注:
- 我使用的是
,因为combinelateest
将发出3个单独的事件,merge
将在开始时发出1个组合事件。之后,combinelateest
将在每次更改时发出,并将为您提供3个观察值的更新组合值,其中,combinelatetest
将仅为您提供一个更新值,而不是组合值merge
- 使用
将新的组合值与以前的组合值进行比较。我特别将其放在distinctUntilChanged
之后,因为您需要将新的去抖动值与旧的去抖动值进行比较去抖动时间
const valueChanges: Observable<any>[] = [
this.numberForm.get('dropdown').valueChanges,
this.numberForm.get('onValue').valueChanges,
this.numberForm.get('onValueUnit').valueChanges
].map(obs => obs.pipe(startWith(null)));
combineLatest(valueChanges).pipe(
debounceTime(this.delay),
distinctUntilChanged((prev, curr) =>
prev[0] === curr[0] && prev[1] === curr[1] && prev[2] === curr[2]
),
takeUntil(this.ngUnsubscribe),
).subscribe(() => {
this.onDataChange();
});