【问题标题】:distinctUntilChanged with ngrxdistinctUntilChanged 与 ngrx
【发布时间】:2018-11-26 20:40:01
【问题描述】:

我正在为下面的代码示例而苦苦挣扎。我试过让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 每次都会报告所有道具的变化

【问题讨论】:

  • 我喜欢你的方法,事实上我尝试了完全相同的事情并得到了同样令人失望的结果 - 例如。什么时候总是返回真/什么时候总是返回假......它仍然允许一切都在管道中进行
  • 啊我解决了我的问题 - 我正在使用 angular 并且有 25 个组件实例,每个实例都单独订阅 - 所以看起来管道被触发了 25 次,但实际上它每个实例被触发一次

标签: rxjs ngrx


【解决方案1】:

嗯,我不这么认为。我在 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 你在你的点击方法中调用了一些修改你的商店以便生成新事件的东西。我不知道,但提出一些想法不会有什么坏处。

【讨论】:

  • 感谢您的想法 - 到目前为止,他们都没有解决我的问题,但我将开始评论一些事情并尝试找出正在发生的事情
猜你喜欢
  • 2019-11-07
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2018-12-25
相关资源
最近更新 更多