在Angular中使用Typescript时能否在一个Pipe内调用另一个Pipe?
问题解答
现有代码运行异常原因
combineLatest返回的是冷Observable,你没有执行订阅操作,管道内部的map逻辑完全不会触发,probe赋值的代码从未运行- Observable逻辑是异步执行的,就算你加了订阅,同步执行的
return probe会先于异步赋值逻辑跑完,返回的永远是初始的undefined - 循环内重复创建combineLatest流属于冗余逻辑,还存在内存泄漏风险
调用已有Pipe的方案可行性
完全可行。Angular的Pipe本质是带@Pipe装饰器的普通类,你可以直接在当前Pipe的构造函数中注入已实现的校验Pipe,循环时直接调用它的transform方法传入group[i].struktur.id即可,无需重复复制业务逻辑。
注:如果注入时提示找不到对应Provider,把已有校验Pipe添加到所属NgModule的
providers数组中即可。
优化实现示例
方案1:复用已有Pipe实现(推荐)
假设你已有的校验Pipe名为StrukturEnabledPipe,实现如下:
import { StrukturEnabledPipe } from './struktur-enabled.pipe'; import { combineLatest, Observable, map } from 'rxjs'; @Pipe({ name: 'groupStrukturEnabled' }) export class GroupStrukturEnabledPipe { // 注入已有Pipe constructor(private strukturEnabledPipe: StrukturEnabledPipe) {} transform(group: any[]): Observable<boolean> { // 把每一项的校验逻辑都转为独立流 const checkStreamList = group.map(item => this.strukturEnabledPipe.transform(item.struktur.id) ); // 此处示例逻辑为所有项校验通过才返回true,可根据业务调整为any等逻辑 return combineLatest(checkStreamList).pipe( map(checkResultList => checkResultList.every(result => result)) ); } }
模板调用时需要配合async管道消费Observable结果:
{{ groupVar | groupStrukturEnabled | async }}
方案2:独立重构当前Pipe逻辑
如果不想依赖已有Pipe,可把公共流提取到循环外,避免重复创建:
import { combineLatest, Observable, map, distinctUntilChanged } from 'rxjs'; @Pipe({ name: 'groupStrukturEnabled' }) export class GroupStrukturEnabledPipe { constructor( private iqsService: IqsService, private _erhebungsService: ErhebungsService ) {} transform(group: any[]): Observable<boolean> { return combineLatest([ this.iqsService.darfBogenBearbeiten$, this.iqsService.enabledStateInbearbeitung$, this._erhebungsService.istArchivierteErhebung$ ]).pipe( map(([darfBearbeiten, enabledState, istArchivierteErhebung]) => { // 全局校验不通过直接返回false if (!darfBearbeiten || istArchivierteErhebung) return false; // 循环校验所有子项 return group.every(item => enabledState[item.struktur.id] ?? true); }), distinctUntilChanged() ); } }
内容的提问来源于stack exchange,提问作者Felipe Livingstone
相关产品推荐
相关产品推荐

