订阅Observable之前如何使用distingtUntilChanged检查json对象

时间:2018-08-16 13:51:27

标签: angular rxjs angular2-observables

仅当我从观察者主题接收到的JSON对象的值发生更改时,我才希望订阅可观察对象:

 searchedName = '';


  filters = {
  "page": 1,
  "perPage": 10,
  "sortOrder": "asc",
  "tag": "allUsers",
  "sortBy": "firstname"
}
  getUsers(e)
  {
    console.log("searched")
    const searchedKeyword = this.searchedName.trim();
    if(searchedKeyword !== '')
    this.filters['name'] = searchedKeyword
    this._service.triggerCallForUsers(this.filters)
  }
   ngOnInit()
{
  //Initially called to load users..
   this._service.triggerCallForUsers(this.filters)

   //Subscribe to fetch users
    this._service.startFetchingUsers$
      .distinctUntilChanged()
      .subscribe((filters) => {
        console.log("filters", filters)
        if (filters) {
          this._service.getUsersByFilter(filters)
            .subscribe(
              users => {
                console.log('users', users);

              },
              error => {}
            );
        }

      })
}

其中的过滤器是:

这可能吗?

尝试解决以下问题:

.distinctUntilChanged((a, b) => {
  console.log('compare', b['name'], a['name'], b['name'] === a['name']);
  return a === b
})

//首次订阅时 输出:-没有可供比较的输出

  

///当我添加's'searchedName字段时,即发送到   next()将包含

     

filters ['name']

     

输出:-比较s undefined false

     

//如果将searchedName更改为“ sd”:

     

输出:-比较sd sd true。

更新

   <input type="text" (keyUp.enter)="getUsers($event)" [(ngModel)]="searchedName">

服务:

在使用中,我在可观察到的位置调用next():

private startFetchingUsers = new BehaviorSubject < any > (null);
startFetchingUsers$ = this.startFetchingUsers.asObservable();



triggerCallForCareGroup(filter) {

    this.startFetchingUsers .next(filter);
  }

1 个答案:

答案 0 :(得分:1)

如果您需要深度平等,请尝试使用lodash中的isEqual

subscribe中您也有太多逻辑-考虑将do/tap用于副作用,并将mergeMap用于合并其他Observable。

import { isEqual } from 'lodash';

this._service.startFetchingUsers$
    .distinctUntilChanged(isEqual)
    .do(filters => console.log("filters", filters))
    .mergeMap(filters => this._service.getUsersByFilter(filters))
    .do(users => console.log('users', users))
    .subscribe({
        error(error) {
            console.error(error);
        },
    });
  

当我在过滤器json中更改名称参数时,更新后的值a ['name']和b ['name']相同。

这表明您的代码中的其他地方也可能存在问题。您可以在调用startFetchingUsers.next(newFilters)的地方共享代码吗?

更新

您正在突变this.filters对象,因此您不会看到更改,因为a === b始终成立。对象本身是相同的!像这样使用浅表副本:this._service.triggerCallForUsers({ ...this.filters })