Angular 异步管道不会触发变更检测
Angular async pipe doesn't trigger change detection
我有这个 class 绑定,它应该在加载时为我的图像设置动画,但它永远不会触发。
<img [class.animated]="loader.isLoading$ | async" src="...">
加载程序:
public get isLoading$(): Observable<boolean> {
return this._isLoading$.pipe(
// If the data arrives successfully earlier than in 250ms, no indicator should be shown
switchMap(isLoading => isLoading ? of(true).pipe(delay(250)) : of(false))
);
}
使用 vanilla javascript works(所以我猜 Loader 代码没问题):
ngAfterViewInit(): void {
this.loader.isLoading$.subscribe(
isLoading => {
const img = document.querySelector('img') as HTMLImageElement;
if (isLoading) {
img.classList.add('animated');
}
else {
img.classList.remove('animated');
}
}
);
}
编辑:class 绑定在没有 delay(250)
的情况下也有效,为什么?
class 绑定我哪里做错了?即使 ChangeDetectionStrategy.Default
它也不起作用。
感谢任何解释。
isLoading$()
是一个 getter,因此每次触发更改检测周期时都会调用它,并且它将 return 一个新的 RxJS 链。 async
将取消订阅前一个并订阅新的(可能会在 this._isLoading$
再次发出后发出)。
所以只保留一根链条。也许在您的组件中使用 isLoading$()
创建一个局部变量。
我有这个 class 绑定,它应该在加载时为我的图像设置动画,但它永远不会触发。
<img [class.animated]="loader.isLoading$ | async" src="...">
加载程序:
public get isLoading$(): Observable<boolean> {
return this._isLoading$.pipe(
// If the data arrives successfully earlier than in 250ms, no indicator should be shown
switchMap(isLoading => isLoading ? of(true).pipe(delay(250)) : of(false))
);
}
使用 vanilla javascript works(所以我猜 Loader 代码没问题):
ngAfterViewInit(): void {
this.loader.isLoading$.subscribe(
isLoading => {
const img = document.querySelector('img') as HTMLImageElement;
if (isLoading) {
img.classList.add('animated');
}
else {
img.classList.remove('animated');
}
}
);
}
编辑:class 绑定在没有 delay(250)
的情况下也有效,为什么?
class 绑定我哪里做错了?即使 ChangeDetectionStrategy.Default
它也不起作用。
感谢任何解释。
isLoading$()
是一个 getter,因此每次触发更改检测周期时都会调用它,并且它将 return 一个新的 RxJS 链。 async
将取消订阅前一个并订阅新的(可能会在 this._isLoading$
再次发出后发出)。
所以只保留一根链条。也许在您的组件中使用 isLoading$()
创建一个局部变量。