BehaviourSubject上的distinctUntilChanged()无法正常工作

时间:2018-03-05 14:16:45

标签: angular rxjs angular2-observables behaviorsubject

我的package.json:

  • rxjs":" ^ 5.5.6"
  • @angular:" 6.0.0-beta.5

searchTextValueSubject是一个BehaviorSubject

import { debounceTime } from 'rxjs/operators';
import { distinctUntilChanged } from 'rxjs/operators';
import { pipe } from 'rxjs';

this.sharingVariableService
    .searchTextValueSubject
    .pipe(
        distinctUntilChanged((x, y) => {
            console.log(y.BarCodeS === x.BarCodeS);
            console.log(y.BarCodeS);
            console.log(x.BarCodeS);
            return y.BarCodeS === x.BarCodeS
        })
    )
    .subscribe((searchTextValue) => {
        this.searchTextValue = searchTextValue;
        this.getRessourceHardware(this.serverDataRessourceHardware._meta.max_results, this.searchTextValue);
    });

结果:

  

是的,' d',' d'

     

是的,' da',' da'

预期:

  

错,' ',' d'

     

错误,' d',' da'

我可能不了解某些事情。你能指点我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

看起来您可能会将变异值发送到searchTextValueSubject

确保您的代码做类似的事情......

let value = {BarCodeS: 'd'}
this.sharingVariableService.searchTextValueSubject.next(value);

value.BarCodeS = 'da'; // wrong!
this.sharingVariableService.searchTextValueSubject.next(value);

正确的方法是:

const value0 = {BarCodeS: 'd'}
this.sharingVariableService.searchTextValueSubject.next(value0);

const value1 = {...value0, BarCodeS: 'da'}; // right
this.sharingVariableService.searchTextValueSubject.next(value1);

另请注意,第一次发射上永远不会调用distinctUntilChanged比较器函数(第一次发射必然是不同的)