【问题标题】:Angular 2 how to prevent subscribe from firing unless the either of the two values returned by map has changedAngular 2如何防止订阅触发,除非map返回的两个值中的任何一个发生了变化
【发布时间】: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这两个值发生了变化”。我不介意改变答案,但问题也应该改变:“除非其中一个所有的值都改变了”。
  • 编辑清楚。

标签: angular typescript rxjs ngrx angular2-observables


【解决方案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 属性,它只是一个跟踪更改数量的计数器。我想我可以用它作为比较器。
  • 检查答案,因为由于您更改问题,逻辑已更改。此外,将解决方案添加到问题中也不是一个好主意;它更令人困惑,不太可能对其他人有用。这个问题现在没有意义了。
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多