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

2024-05-28

我有一个全局加载器,其实现如下:

核心模块:

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 and NavigationEnd事件,我发现NavigationEnd之后立即触发NavigationStart(这是正常的),而Overlay大约在0.5秒后消失。

我已阅读CHANGELOG.md但我没有发现任何可以解释这个问题的东西。欢迎任何想法。

Edit:

经过进一步研究,我通过设置恢复了以前的行为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问题 https://github.com/angular/material2/pull/10145。它修复了淡出动画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();
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Angular 中实现全局加载器 的相关文章

  • jQuery:在整个文档上触发按键功能,但不在输入和文本区域内触发按键功能?

    我有这个 document keypress function e if e keyCode 119 w doSomething Wo 在我的文档上按 w 时doSomething 函数触发 当我当前正在输入 焦点 时 如何防止它触发inp
  • 在 `data:` URI 中转义 SVG 的正确方法?

    Chrome 最近已启动使用换行符阻止 URL 和 lt 人物 https www chromestatus com features 5735596811091968 我维护的应用程序严重依赖数据 URI 中的 SVG 图像 data i
  • 在原子操作中测试和递减?

    我刚刚发现了一个恼人的错误 它基本上是一个竞争条件 为了便于论证 我们假设一个非常简单的文档结构 例如 id XXX amount 100 集合中存在数百个这样的文档 并且由多个编写器访问 这些编写器有效地尝试将数量降低任何值 但绝不会低于
  • 调整大小后获取实际图像大小

    我有一个充满缩略图的页面 用 css 调整大小150x150 当我单击缩略图时 页面变暗 并且图像以其真实尺寸显示 目前 我必须手动创建一个包含所有图像的实际高度的数组 为了解决设计问题 减少画廊的手动操作 我需要在调整图像大小 CSS 后
  • 超出 Google 电子表格上的 ImportXML 限制

    我现在陷入了 抓取问题 特别是我想将作者的姓名从网页提取到谷歌电子表格 其实功能 IMPORTXML A2 span class author vcard meta item 正在工作 但是当我增加了要抓取的链接数量后 它就开始无限加载 所
  • 我应该选择哪个 redux 中间件?

    按照指南 我发现了一些用于 redux 应用程序的中间件 Redux 重击 https github com gaearon redux thunk Redux 承诺 https github com acdlite redux promi
  • Collada 模型面在 Three.js 中无法正确显示

    将 collada 模型导入到 Three js 后 模型的某些面只能从模型内部看到 从外部看不到 如何解决相关面孔的问题 是否可以让模特的脸部从两侧都可见 它无法正常工作的原因是您的文件设置了此双面标志
  • 等待动态加载脚本

    在我的页面正文中 我需要插入以下代码作为 AJAX 调用的结果 p Loading jQuery p p Using jQuery p 我不能使用 load 由于文档已经加载 因此该事件不会触发 这安全吗 如果没有 我如何确保在执行自定义生
  • Apache 服务器上的服务器端 Javascript

    我们打算使用Apache https httpd apache org 用于 Web 开发的服务器 对于服务器端脚本 我们希望使用服务器端 javascript 要使服务器端 javascript 在 Apache 服务器上工作需要什么 S
  • 是否有 IE 渲染完成事件?

    在尝试确定页面加载时间为 20 秒的原因时 我发现 IE8 中有一些奇怪的行为 场景是这样的 我进行 ajax 调用 它返回并且回调看起来像这样 StoreDetailsContainer html tableHtml var StoreD
  • 变量值的 swap() 函数[重复]

    这个问题在这里已经有答案了 我无法达到下面这个交换函数的预期结果 我希望将值打印为 3 2 function swap x y var t x x y y t console log swap 2 3 任何线索将不胜感激 您的函数正在内部交
  • 每次页面重新加载时都会出现新的 Google 登录库提示

    在我的项目中 我使用常规弹出客户端 JS 身份验证 平台客户端 https developers google com identity sign in web sign in 我从旧版 Google Sign 迁移到新版 Google I
  • 将 MathJax 脚本添加到 Office 365 Sharepoint 中的页面

    我正在尝试将 Mathjax 库添加到 SharePoint 库 以便我们可以使用 LaTex 语法来添加方程 我在网上搜索时看到了多种方法 但似乎没有一种方法可以与最新版本的 MathJax 和 Office 365 版本的 ShareP
  • iOS 11 getUserMedia 不起作用?

    苹果公司发表声明称getUserMedia将在 iOS 11 上完全正常运行 安装 iOS 11 Beta 版本 5 后 我确实收到一条消息 表明我的网站请求访问我的相机和麦克风 但似乎是这样的 video src window URL c
  • “WebSocket 在连接建立之前已关闭”是什么意思?

    我正在使用 JavaScript 和联盟平台 http www unionplatform com我该如何诊断这个问题 非常感谢 如果你去http jsbin com ekusep 6 edit http jsbin com ekusep
  • JavaScript 点击事件在 Android 4.0.4 默认浏览器上的 Samsung Galaxy SIII 上不起作用

    我在 Android 4 0 4 上使用 Samsung Galaxy SIII 的默认浏览器时遇到了最奇怪的问题 对于以下页面 单击链接将不会触发 JavaScript 处理程序 从其中一个 div 的内容中删除单个 a 字母使它们再次工
  • 如何在不刷新页面的情况下更新页面 html 和 url

    我想知道是否有人可以指出我学习如何在不刷新页面的情况下更新页面 html 和 url 的方向 是否有任何现有的 javascript 库可以处理这个问题 或者有一本涵盖此类事情的好书 这是使用该效果的示例网站 http onedesignc
  • 如何防止IE11弹出(您确定要离开此页面)

    我正在处理一个页面 除了一个下拉菜单可供选择外 我无需输入任何内容 但在 IE11 中 当我尝试转到下一页时 它会弹出该消息 我想阻止这种弹出的发生 所以我只是想知道 IE11 中弹出窗口的默认行为是什么 因为它不会出现在 Chrome 或
  • 如何在jsp页面中包含javascript

    我是 J2EE 和 Web 开发的新手 这是我的问题 我想在网页中包含 angular js 这是有效的版本 但我也想要一些本地的 javascript 文件 并且希望我想在本地目录中导入 angularjs
  • 在 Javascript 中动态创建 []array

    也许这将是一个真正愚蠢的问题 但我是 JavaScript 新手 并且坚持动态创建数组 如下格式 items Date 2012 01 21T23 45 10 280Z Value 7 Date 2012 01 26T23 45 10 28

随机推荐

  • 使用peerjs webrtc共享屏幕+共享系统音频时麦克风不工作

    我们已经尝试过共享屏幕声音的 共享屏幕时 麦克风和屏幕共享音频不能同时工作 麦克风不工作时系统音频已开启 系统音频确实不工作如果末端麦克风打开 请解释一下问题是什么 这是代码 function startScreenShare if scr
  • Jenkins:有什么方法可以清理 Jenkins 工作区吗?

    如何清理 Jenkins 中的工作区 我在用AccuRev作为版本控制工具 我创建freestyle詹金斯的项目 有一种方法可以清理 Jenkins 中的工作区 您可以在构建之前或构建之后清理工作区 首先 安装工作区清理插件 https w
  • 获取 TextBox 中的文本行数

    我试图通过标签显示文本框中的文本行数 但是 问题是如果最后一行为空 标签必须显示没有空行的行号 例如 如果它们有 5 行 最后一行为空 则标签应将行数显示为 4 Thanks private void txt CurrentVinFilte
  • 如何获取 ASP.NET MVC 中当前的虚拟路径?

    如何从 ASP NET MVC 视图中获取当前路径 URL 如果没有办法将其获取到视图中 那么如何将其获取到控制器中以便将其传递到视图呢 EDIT 我不需要 url 的协议和主机部分 这将为您返回视图中的 url
  • 控制器 HMVC 内的 CodeIgniter 负载控制器

    我在用着http github com philsturgeon codeigniter template http github com philsturgeon codeigniter template 对于模板 我尝试将其他控制器视图
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • CGridview 在页面加载时过滤器,在搜索字段中预定义值

    我正在使用 Yii 框架 我已使用以下命令在我的 cgridview 过滤器字段之一中设置了一个值 这是我为搜索字段分配值的 jQuery gridviewid find input type text textarea select fi
  • 如何在正则表达式中编写可选单词?

    我想编写一个识别以下模式的 java 正则表达式 abc def the ghi and abc def ghi 我试过这个 abc def the ghi 但是 它没有识别第二种模式 我哪里出错了 abc def the ghi 删除多余
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • testcafe是否支持rest api的测试

    当您尝试直接测试其余 api url 时 测试会在 testcafe 浏览器中挂起 我正在尝试使用请求挂钩针对我的其余 API 端点运行测试 但是当我从命令行运行测试时 浏览器会打开 API 端点并加载它并挂起 测试没有通过或失败并且挂起
  • AngularJS limitTo 按最后 2 条记录

    可以结合AngularJS吗filter https docs angularjs org api ng filter filter order https docs angularjs org api ng filter orderBy
  • 字符串在内部存储为单独的字符,内存中的每个字符都由其他类似的字符串共享吗?

    例如 是字符串var1 ROB 存储为 3 个内存位置 R O 和 B 每个位置都有自己的地址和变量var1指向内存位置R 那它怎么指向O和B呢 并执行其他字符串 例如 var2 BOB 指向内存中相同的 B 和 Ovar1指的是 字符串如
  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • 标签栏随键盘一起上升

    这个问题之前已经发过 但是没有答案 Problem TabBar gt 2 个选项卡 选项卡一有一个Scrollview and an EddiText 标签二 其他 贴带时EditText 软键盘上升 TabBar与它一起 一个丑陋的解决
  • 当给定 100k 项时,QListView 需要很长时间才能更新

    我在读取文件时遇到问题 具体是我想制作一本小字典 在我需要阅读的文件中有这样的内容 a Ph P6 a snsr CA a b c fb Dj a b c book i BS A except B gate oOPa y a font kQ
  • ggplot 中跨组的连续线

    我有一个数据时间序列 其中观察了一些数据 模拟了一些数据 我想生成整个数据系列随时间变化的图 其中颜色表示数据源 但是 我只能弄清楚如何使 ggplot 中的 geom line 连接同一组中的点 这是一个例子来说明 Create samp
  • 如何将二维数组作为 multiprocessing.Array 传递给 multiprocessing.Pool?

    我的目标是将父数组传递给mp Pool并填充它2s 同时将其分发到不同的进程 这适用于一维数组 import numpy as np import multiprocessing as mp import itertools def wor
  • 无法读取第 0 行,第 -1 列

    我正在尝试复制使用 SQLite 管理器创建的数据库 我在其中执行了以下操作 CREATE TABLE android metadata locale TEXT DEFAULT en US and INSERT INTO android m
  • SQL注入方法

    注射程序是 SELECT UserId Name Password FROM Users WHERE UserId 105 or 1 1 但是 我的问题是注入查询在 sql 中是如何工作的 当你在代码中将查询作为字符串时 就像这样 Quer
  • 如何在 Angular 中实现全局加载器

    我有一个全局加载器 其实现如下 核心模块 router events pipe filter x gt x instanceof NavigationStart subscribe gt loaderService show router