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.changes
和pagination.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
)。如果必须更改all
或total
,您可以使用:
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;
);
【讨论】:
嗯,它似乎没有运行。我不小心发布了错误的订阅调用,但在我的另一个中,all
和 total
都是包含一些属性的对象,并且还有另一个对象作为这些属性之一。将它们与===
进行比较是否仍然有效?
没有。如果您认为没有更改,则必须提供返回 true
的实现。这取决于你。
好的,我试试看。
对不起,我用正确的代码和正确的描述更新了问题。看一看。我为这两个对象添加了一个changes
属性,它只是一个跟踪更改数量的计数器。我想我可以用它作为比较器。
检查答案,因为由于您更改问题,逻辑已更改。此外,将解决方案添加到问题中也不是一个好主意;它更令人困惑,不太可能对其他人有用。这个问题现在没有意义了。以上是关于Angular 2如何防止订阅触发,除非map返回的两个值中的任何一个发生了变化的主要内容,如果未能解决你的问题,请参考以下文章
如何仅在输入模糊时触发反应表单 valueChanges 订阅并在 Angular 2 中输入键
Angular/RxJS 6:如何防止重复的 HTTP 请求?