【发布时间】:2017-11-24 12:01:37
【问题描述】:
我需要更新可观察对象的属性。我设法让它工作,但我真的不喜欢我是怎么做到的。
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() 来破坏引用(否则 rxjs distinctUntilChanged() 不会因为明显的原因触发)。
是否有某种 rxjs 扩展可以缩短我正在做的事情?我正在考虑类似于filter$.commitValueChanges() 的东西,它会在内部执行filter$.next(_.clone(filter$.value))。
我对 observables 很陌生,所以我不确定我一开始是否以完全错误的方式考虑这个问题。我知道当我想触发更改侦听器时,我应该提交新状态。我不确定您是否应该直接修改 filter$.value ?或者您通常应该有两个对象 - filter(过滤器)和 filter$(可观察的过滤器)然后绝对不要直接改变 filter$,而只需在每次更改时将 filter 提交到 .next()在filter 上发生了吗?但这似乎是多余的,因为我们现在有两个对象,我们正在通过应用程序更改一个对象,并且必须通过附加各种事件处理程序来手动处理,而所有这些只是为了能够更新另一个对象 - filter$。这对我来说似乎太过分了。
谢谢。
【问题讨论】:
标签: angular rxjs observable angular2-observables behaviorsubject