Angular 2如何防止订阅触发,除非map返回的两个值中的任何一个发生了变化

Posted

技术标签:

【中文标题】Angular 2如何防止订阅触发,除非map返回的两个值中的任何一个发生了变化【英文标题】:Angular 2 how to prevent subscribe from firing unless the either of the two values returned by map has changed 【发布时间】:2017-06-03 23:12:03 【问题描述】:

我发现了一个不容易解决的简单问题,我试图让订阅不会触发,除非sorting.changespagination.changes 这两个值中的任何一个发生了变化。我猜应该使用distinctUntilChanged,但是我无法弄清楚要提供什么作为它的参数,因为我有两个值需要检查而不是一个。

编辑(这次是正确的订阅调用):这是订阅调用:

this.requestParamsSubscription = this.store.select('brands')
  .distinctUntilChanged()
  .map((brands: IBrandsStorage) => 
    return sorting: brands.sorting, pagination: brands.pagination;
  )
  .subscribe(
    params => 
      this.store.dispatch(type: BrandsActions.GET_BRANDS_REQUEST);
    
  );

changes of the objects 是一个简单的数字计数器,可以跟踪变化,我想我可以用它来检查自上次以来对象是否发生了变化。

有什么想法吗?

【问题讨论】:

标题的变化与问题文本不一致:“除非all和total这两个值发生了变化”。我不介意改变答案,但问题也应该改变:“除非其中一个所有的值都改变了”。 编辑清楚。 【参考方案1】:

distinctUntilChanged 可以传递一个比较函数(如果参数没有改变,它应该返回true)。如果必须更改alltotal,您可以使用:

this.brandsStorageSubscription = this.store.select('brands')
  .map((brands: IBrandsStorage) => ( all: brands.all, total: brands.total ))
  .distinctUntilChanged((a, b) => (a.all === b.all) && (a.total === b.total))
  .subscribe(
    brands => 
      console.log(brands);
      this.total = brands.total;
      this.brands = brands.all;
    
  );

【讨论】:

嗯,它似乎没有运行。我不小心发布了错误的订阅调用,但在我的另一个中,alltotal 都是包含一些属性的对象,并且还有另一个对象作为这些属性之一。将它们与=== 进行比较是否仍然有效? 没有。如果您认为没有更改,则必须提供返回 true 的实现。这取决于你。 好的,我试试看。 对不起,我用正确的代码和正确的描述更新了问题。看一看。我为这两个对象添加了一个changes 属性,它只是一个跟踪更改数量的计数器。我想我可以用它作为比较器。 检查答案,因为由于您更改问题,逻辑已更改。此外,将解决方案添加到问题中也不是一个好主意;它更令人困惑,不太可能对其他人有用。这个问题现在没有意义了。

以上是关于Angular 2如何防止订阅触发,除非map返回的两个值中的任何一个发生了变化的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 / 如何防止 IE 触发自动输入验证?

如何仅在输入模糊时触发反应表单 valueChanges 订阅并在 Angular 2 中输入键

Angular/RxJS 6:如何防止重复的 HTTP 请求?

NGRX - 如何在 Angular 防护中访问我的应用程序状态?

如何在订阅Angular 4中返回值

Angular Jasmine 测试未在 ngOnInit 中触发订阅