angular - 当条件发生变化时重新运行管道以进行观察(Angular 7)
问题描述
我有一个表,我正在根据用户输入的字段进行过滤,该表的源是由 BehaviorSubject 制成的可观察对象。这是设置:
class Component {
//filled with a http call to a webservice
private subject$ = new BehaviorSubject([])
public state = 'Open';
public workOrders$ = this.subjects$.asObservable().pipe(map(orders => {
return orders.filter(f => f.State == this.state)
}));
}
正在重复的 tr 的 HTML 是
<tr *ngFor="let order of workOrders$ | async">
以及状态输入字段的 HTML
<input type="text" [(ngModel)]="state" />
在初始加载时,这会按状态正确过滤所有工作订单,但是每当this.state
发生更改时,我希望该管道重新过滤数组以更新表。完成此类任务的最佳实践是什么?我不想改变主题,因为我需要保留原始数据集以供再次更改过滤器时使用。
解决方案
您可以使用 rxjs combineLatest函数并有一个可观察的跟踪需要重新计算:
private subject$ = new BehaviorSubject([])
public state = 'Open';
public stateSubject = new BehaviorSubject(this.state);
public workOrders$ = combineLatest(
this.subjects$,
this.stateSubject,
(orders, state) => {
return orders.filter(f => f.State == state)
}
);
然后根据您的输入:
<input type="text" (ngModelChange)="stateSubject.next($event)" [(ngModel)]="state" />
推荐阅读
- javascript - 切换 plyr.js 的播放/停止
- pyqt - 此线程上没有运行事件循环
- angular - 如何在Angular Service中动态地将参数添加到url
- python - 如何在 sklearn cross_val_score 中使用自定义评分功能
- javascript - Typescript 找不到使用 webpack 别名导入的模块
- r - if 内嵌套 ifelse 语句
- ios - Unity 集成本机应用程序中的 Clang 错误
- shell - 从任务的输出中获取一个值并在 Ansible Playbook 中调试消息
- macos - OSX:关闭 mysql 工作台主窗口后无法打开它
- python - 从opencv中的二维索引数组获取矩形