Rxjs 仅当窗体控件的上一个值为时,才能订阅更改!==formcontrol的当前值

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

仅当输入/选择的上一个值!=输入/选择的当前值

但是我注意到,每当将光标放在输入字段上时,它仍然调用onDataChange()(但没有更改输入字段的任何值/更改下拉值的选择)

我使用了startWith(null)、pairwise和filter(prev!=next),但它仍然执行onDataChange(),即使上一个值与下一个值相同

主要问题是当将光标放在输入字段上但不更改任何值时,它仍然调用onDataChange()

我只想在输入值发生更改/下拉选择发生更改时调用onDataChange()。onDataChange()将调用api调用,检索结果可能需要更长的时间

有没有人遇到过类似的问题并能提供指导?谢谢

"


{{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
    ,因为
    merge
    将发出3个单独的事件,
    combinelateest
    将在开始时发出1个组合事件。之后,
    combinelatetest
    将在每次更改时发出,并将为您提供3个观察值的更新组合值,其中,
    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();
});