使用 RxJS combineLatest 过滤可观察对象?
Using RxJS combineLatest to filter observables?
我正在查看是否可以在 Angular 服务中使用 combineLatest
来删除 activeFiler$
开关块(该服务应该做同样的事情)。这是组件 design right now (stackblitz link),我正在尝试删除除 render$
observable 之外的所有属性:
export class TodosComponent implements OnInit {
constructor(private ts:TodoService) {}
render$: Observable<Todo[]>;
activeFilter$: Observable<VISIBILITY_FILTER>;
ngOnInit() {
this.render$ = this.ts.selectedTodos$;
this.activeFilter$ = this.ts.activeFilter$;
this.activeFilter$.subscribe(active=>{
switch (active) {
case VISIBILITY_FILTER.SHOW_COMPLETED:
this.render$ = this.ts.completeTodos$;
break;
case VISIBILITY_FILTER.SHOW_ACTIVE:
this.render$ = this.ts.incompleteTodos$;
break;
default:
this.render$ = this.ts.todos$;
}
});
}
}
}
如图所示,我已将 this.render$
初始化为从 todo.service.ts
文件返回的 Observable。该方法如下所示:
this.selectedTodos$ =
combineLatest(this.activeFilter$, this.completeTodos$, this.incompleteTodos$, this.todos$, this.applyFilter);
private applyFilter(filter, completeTodos, incompleteTodos, todos): Todo[] {
switch (filter) {
case VISIBILITY_FILTER.SHOW_COMPLETED:
return completeTodos;
case VISIBILITY_FILTER.SHOW_ACTIVE:
return incompleteTodos;
default:
return todos;
}
}
所有这些都准备就绪后,我想我应该能够删除 todos 组件中的 this.ts.ostore.observe(ACTIVE_FILTER_KEY).subscribe(active=>{
块,但如果我删除了整个应用程序将停止工作。
一件奇怪的事情是,如果我注释掉 $activeFilter
订阅,并记录这个:
this.render$ = this.ts.selectedTodos$;
this.render$.subscribe(v=>console.log(v));
当我输入更多待办事项时,它们会被记录下来,但不会呈现...有什么想法吗?
我成功了。
使其工作的核心部分是当每个 Observable
至少发出一次时 combineLatest
发出。
在我的例子中,执行通知的 ReplaySubject<Todo[]>
实例在初始化 EStore 时没有执行通知,因此 ReplaySubject<Todo[]>
永远不会触发 combinedLatest
运算符。
我更改了 EStore 实现,使其不发出任何内容或 EStore
初始化时使用的实体,现在它工作......非常好。
changeDetection: ChangeDetectionStrategy.OnPush
有效。我们不需要事件发射器或 @Input
来工作。只需查询商店,让它发挥它的魔力。
我正在查看是否可以在 Angular 服务中使用 combineLatest
来删除 activeFiler$
开关块(该服务应该做同样的事情)。这是组件 design right now (stackblitz link),我正在尝试删除除 render$
observable 之外的所有属性:
export class TodosComponent implements OnInit {
constructor(private ts:TodoService) {}
render$: Observable<Todo[]>;
activeFilter$: Observable<VISIBILITY_FILTER>;
ngOnInit() {
this.render$ = this.ts.selectedTodos$;
this.activeFilter$ = this.ts.activeFilter$;
this.activeFilter$.subscribe(active=>{
switch (active) {
case VISIBILITY_FILTER.SHOW_COMPLETED:
this.render$ = this.ts.completeTodos$;
break;
case VISIBILITY_FILTER.SHOW_ACTIVE:
this.render$ = this.ts.incompleteTodos$;
break;
default:
this.render$ = this.ts.todos$;
}
});
}
}
}
如图所示,我已将 this.render$
初始化为从 todo.service.ts
文件返回的 Observable。该方法如下所示:
this.selectedTodos$ =
combineLatest(this.activeFilter$, this.completeTodos$, this.incompleteTodos$, this.todos$, this.applyFilter);
private applyFilter(filter, completeTodos, incompleteTodos, todos): Todo[] {
switch (filter) {
case VISIBILITY_FILTER.SHOW_COMPLETED:
return completeTodos;
case VISIBILITY_FILTER.SHOW_ACTIVE:
return incompleteTodos;
default:
return todos;
}
}
所有这些都准备就绪后,我想我应该能够删除 todos 组件中的 this.ts.ostore.observe(ACTIVE_FILTER_KEY).subscribe(active=>{
块,但如果我删除了整个应用程序将停止工作。
一件奇怪的事情是,如果我注释掉 $activeFilter
订阅,并记录这个:
this.render$ = this.ts.selectedTodos$;
this.render$.subscribe(v=>console.log(v));
当我输入更多待办事项时,它们会被记录下来,但不会呈现...有什么想法吗?
我成功了。
使其工作的核心部分是当每个 Observable
至少发出一次时 combineLatest
发出。
在我的例子中,执行通知的 ReplaySubject<Todo[]>
实例在初始化 EStore 时没有执行通知,因此 ReplaySubject<Todo[]>
永远不会触发 combinedLatest
运算符。
我更改了 EStore 实现,使其不发出任何内容或 EStore
初始化时使用的实体,现在它工作......非常好。
changeDetection: ChangeDetectionStrategy.OnPush
有效。我们不需要事件发射器或 @Input
来工作。只需查询商店,让它发挥它的魔力。