我有一个Angular 2服务,用于捕获组件中某些输入的更改,并使用BehaviorSubject传递给另一个组件。因为我想将当前值与最后的值进行比较,我想根据另一个SO问题使用bufferCount并将其传递给过滤器。不幸的是,我从bufferCount中获得的行为有点莫名其妙,我无法判断我是否在做出可观察的错误。
我的服务很简单:实例化一个BehaviorSubject,一个函数来提升值,一个函数返回observable:
export class EventFilterService {
private filtersSubject: BehaviorSubject<Object>;
constructor() {
this.filtersSubject = new BehaviorSubject<Object>({
search: '',
types: [],
dates: []
});
}
setFilters(filters: {}) {
this.filtersSubject.next(filters);
}
getFilters() {
return this.filtersSubject.asObservable();
}
}
在带有输入的组件中,我只是将更新后的值传递给click事件上的setFilters。在我需要数据的组件中,我设置了一个ngOnInit来设置订阅:
ngOnInit() {
this.eventFilterService.getFilters().bufferCount(2, 1).filter((val:[{}]) => {
console.log(val[0]['types'] == val[1]['types']);
return true;
}).subscribe((data) => console.log(data));
this.eventFilterService.getFilters().debounceTime(2500).subscribe((filters) => {
console.log(filters);
this.filters = filters;
this.eventService.getEvents(this.filters).subscribe((data: Event[]) => { this.processEvents(data); });
});
}
然而,结果很奇怪。在加载时,我得到一个空白的过滤器对象,如预期的那样。过滤器第一次更改时,缓冲区将最后一个值作为空白对象,将当前值作为选择的任何值。但是,在此后的每次更改中,缓冲区返回两个相同的值(前一个状态与当前状态相同,这是正确的)。记录点击事件,我看到它只被点击一次,服务的setFilters
方法只被调用一次。
这是我不理解bufferCount如何工作的情况吗?我的设计很糟糕?
这是一个显示我正在推动的行为的plunker link。保持控制台开放,看看我的意思。