gpt4 book ai didi

javascript - 如何在 Angular 中实现全局加载器

转载 作者:太空狗 更新时间:2023-10-29 16:59:00 31 4
gpt4 key购买 nike

我有一个全局加载器,它是这样实现的:

核心模块:

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事件,我发现 NavigationEndNavigationStart 之后立即触发(这是正常的),而 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com