作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个全局加载器,它是这样实现的:
核心模块:
router.events.pipe(
filter(x => x instanceof NavigationStart)
).subscribe(() => loaderService.show());
router.events.pipe(
filter(x => x instanceof NavigationEnd || x instanceof NavigationCancel || x instanceof NavigationError)
).subscribe(() => loaderService.hide());
加载服务:
@Injectable({
providedIn: 'root'
})
export class LoaderService {
overlayRef: OverlayRef;
componentFactory: ComponentFactory<LoaderComponent>;
componentPortal: ComponentPortal<LoaderComponent>;
componentRef: ComponentRef<LoaderComponent>;
constructor(
private overlay: Overlay,
private componentFactoryResolver: ComponentFactoryResolver
) {
this.overlayRef = this.overlay.create(
{
hasBackdrop: true,
positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically()
}
);
this.componentFactory = this.componentFactoryResolver.resolveComponentFactory(LoaderComponent);
this.componentPortal = new ComponentPortal(this.componentFactory.componentType);
}
show(message?: string) {
this.componentRef = this.overlayRef.attach<LoaderComponent>(this.componentPortal);
this.componentRef.instance.message = message;
}
hide() {
this.overlayRef.detach();
}
}
当使用 Angular 7.0.2 运行时,行为(我想要的)是:
我已经更新到 Angular 7.2,现在的行为是:
LoaderComponent
的叠加层导航到没有任何解析器的路由时我在 NavigationStart
上添加了一些日志和 NavigationEnd
事件,我发现 NavigationEnd
在 NavigationStart
之后立即触发(这是正常的),而 Overlay 会在大约 0.5 秒后消失。
我已阅读 CHANGELOG.md
但我没有发现任何可以解释这个问题的东西。欢迎任何想法。
编辑:
经过进一步研究,我通过设置 package.json
恢复了以前的行为像这样:
"@angular/cdk": "~7.0.0",
"@angular/material": "~7.0.0",
而不是这个:
"@angular/cdk": "~7.2.0",
"@angular/material": "~7.2.0",
我已经确定了版本 7.1.0 中发布的错误提交,并将我的问题发布到相关的 GitHub issue 上.它修复了 Overlay
的淡出动画.
获得所需行为的符合 v7.1+ 的方法是什么?根据我的说法,最好的办法是:仅在必要时显示加载程序,但 NavigationStart
不包含所需的信息。我想避免以某些反跳行为结束。
最佳答案
在意识到 delay
是用户体验方面的一个很好的解决方案后,这就是我的最终结果,因为它允许加载器仅在加载时间值得显示加载器时显示。
我不喜欢这个解决方案,因为我更喜欢将状态封装到 Observable
运算符中而不是共享变量中,但我无法实现。
counter = 0;
router.events.pipe(
filter(x => x instanceof NavigationStart),
delay(200),
).subscribe(() => {
/*
If this condition is true, then the event corresponding to the end of this NavigationStart
has not passed yet so we show the loader
*/
if (this.counter === 0) {
loaderService.show();
}
this.counter++;
});
router.events.pipe(
filter(x => x instanceof NavigationEnd || x instanceof NavigationCancel || x instanceof NavigationError)
).subscribe(() => {
this.counter--;
loaderService.hide();
});
关于javascript - 如何在 Angular 中实现全局加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54135784/
我是一名优秀的程序员,十分优秀!