首页 > 解决方案 > distinctUntilChanged 与 ngrx

问题描述

我正在为下面的代码示例而苦苦挣扎。我试过compareFilters总是return true,总是return false,无论哪种方式,我的日志中都会有很多“*******” - 至少有一个应该完全切断我预期的供应?我错过了什么?

    this.filters = this.store
        .select(state => state.filters)
        // This line needed as otherwise change in geolocation triggers state to be
        // resent, overwriting any changes user has made on filters menu
        .pipe(
            distinctUntilChanged(compareFilters),
            tap((filters: Filters) => {
                console.log("*****", filters);
                this.location.pushState(
                    {},
                    "",
                    "/recommendations/" + toUrl(filters)
                );                    
            })
        );

更一般地说,我在组件中看到的是,无论状态的哪个部分发生了ngOnChanges变化,每次都会报告所有道具的变化

标签: rxjsngrx

解决方案


嗯,我不这么认为。我在 StackBliz 上写了一个快速示例,它按预期工作。仅打印 1 个。您确定 ngrx 存储不会发出所有事件吗?因为您的 rxjs 代码是正确的。

import { Observable, of } from 'rxjs';
import { distinctUntilChanged, tap  } from 'rxjs/operators';

of("1", "2", "3", "4" ,"5")
.pipe(
  distinctUntilChanged(coperator),
  tap(t => console.log(t))
)
.subscribe()

function coperator(t){
  return true;
}

问题可能在于this.location.pushState您在您的 tap 方法中调用的调用会修改您的商店以便生成新事件。我不知道,但反弹一些想法不会有什么坏处。


推荐阅读