Angular的异步管道确实不会在可观察对象发生改变时自动刷新。然而,我们可以使用一些技巧来解决这个问题。以下是一种可能的解决方案:
import { Pipe, PipeTransform, ChangeDetectorRef } from '@angular/core';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
@Pipe({
name: 'refresh',
pure: false // 设置pure为false以确保管道在每个变化检测周期中都会被调用
})
export class RefreshPipe implements PipeTransform {
constructor(private cdr: ChangeDetectorRef) {}
transform(value$: Observable): Observable {
return value$.pipe(
tap(() => this.cdr.markForCheck()) // 使用ChangeDetectorRef手动触发变化检测
);
}
}
{{ observableValue$ | async | refresh }}
通过将可观察对象传递给refresh
管道,我们可以确保在可观察对象发生变化时刷新视图。
这种方法的关键点在于将ChangeDetectorRef
注入到自定义管道中,并在管道内部使用markForCheck
方法手动触发变化检测。这将导致Angular重新计算管道,并正确刷新视图。