我需要更新可观察对象的属性。我设法让它工作,但我真的不喜欢我是怎么做到的。
next(filter$: BehaviorSubject<GridCollectionFilter>, collection: GridCollectionModel<any>) {
let filter = filter$.value;
if (!filter.page) {
filter.page = 1;
}
filter.page++;
if (filter.page > collection.pageCount) {
filter.page = collection.pageCount;
}
this.updateFilter(filter$);
}
first(filter$: BehaviorSubject<GridCollectionFilter>) {
filter$.value.page = 1;
this.updateFilter(filter$);
}
last(filter$: BehaviorSubject<GridCollectionFilter>, collection: GridCollectionModel<any>) {
filter$.value.page = collection.pageCount;
this.updateFilter(filter$);
}
updateFilter(filter$: BehaviorSubject<GridCollectionFilter>, filter?: GridCollectionFilter) {
filter$.next(_.clone(filter || filter$.value));
}
在这种情况下,是否有更优雅的方式来更新filter$值对象?
filter$.next(_.clone(filter$.value))我真的不喜欢每次我只想通过代码更新被观察对象的一些属性时,将可观察对象的克隆喂给自己的想法。我_.clone()用来破坏引用(否则 rxjsdistinctUntilChanged()不会因为明显的原因触发)。
是否有某种 rxjs 扩展可以缩短我正在做的事情?我正在考虑一些filter$.commitValueChanges()内部会做的事情filter$.next(_.clone(filter$.value))。
我对 observables 很陌生,所以我不确定我是否一开始就以完全错误的方式考虑这个问题。我知道当我想触发更改侦听器时,我应该提交新状态。我不确定您是否应该直接修改 filter$.value ?或者你通常应该有两个对象 - filter(过滤器)和filter$(可观察的过滤器),然后绝对不会filter$直接改变,而是在每次发生更改时简单filter地.next()提交filter?但这似乎是多余的,因为我们现在有两个对象,我们正在通过应用程序更改一个对象,并且必须通过附加各种事件处理程序来手动处理,而所有这些只是为了能够更新另一个对象 -filter$. 这对我来说似乎太过分了。
谢谢。