angular框架-通过依赖注入方式挂载loading以实现任意地方一行代码调用全局loading

news2024/11/26 12:00:04

前言

本文主要阐述关于在angular项目中,loading的常见的使用方式,以及如何全局挂载loading,实现一行代码控制loading开,一行代码控制loading关闭。

正文

首先在angular中增加loading,主要就是组件级和全局挂载,下面分别介绍

一、组件module级的引入loading

常见的angular的这种loading框,基本都是通过xxx.module.ts中引入,这里我举例我们项目中使用的devexpress为例子,可以引入在imports中。
其中devpress的官网如下:https://js.devexpress.com/

主要是通过在各自的业务组件的module中引入,然后在html可以使用该标签,通过变量控制,下面是代码展示:

在这里插入图片描述

在业务的html中,直接写入这个标签即可

在这里插入图片描述

他的显示和隐藏主要通过isLoadPanelVisible变量的true和false去控制即可。如下

在这里插入图片描述

比较的简单,属于很常见的引用第三方组件库的方式。

缺点

如果你的module特别多,业务单据需要在每一个module中去引入,费时费力,且都是重复的代码
所以这时想到了全局挂loading。

大概想法分为以下几种:

  1. 想通过ng可以挂载全局组件,类似于vue的全局组件没在业务里直接引入该组件的html,通过变量控制,后查阅发现angular暂不支持,且引入还是很麻烦(遂放弃)
  2. 第二种全局loading用服务,放到一个module里导出,比如创建个sharedModule , 然后把模块放到exports: [CommonModule, …],用的时候, 就在各自的模块里imports:[sharedModule],但我们这业务module太多了 每个都得引一次,很麻烦(遂放弃)
  3. 第三种全局loading用服务,通过服务依赖注入到主app.component.ts中,只注入后挂载到了window上(最初想挂载到this),主要用到了rxjs的BehaviorSubject改变其变量,下文会详细介绍

全局挂载loading

关于angular的全局挂载loading,下面开始详细介绍:

  • 最初我是想将loading,直接挂载到this上的,实现未果,在全局强行给this增加该服务,但业务上找不到,查了下原因,如下:
    在这里插入图片描述

在 Angular 中,可以在组件类中使用 this 关键字来定义变量和方法,并且这些变量和方法将会成为组件的成员。
但是,在 Angular 中,一般不建议直接在 this 上挂载变量或方法,而是应该在组件类中显式声明它们作为组件的属性和方法。这种方式更符合 TypeScript 的类型检查和编译时检查,也更易于维护和调试。
如果你想要在 Angular 中定义共享状态或服务,应该考虑使用服务提供商(Service Provider)来实现。这种方式能够在整个应用程序中共享数据和逻辑。

所以放弃了this挂载,改用window挂载。

下面是使用服务的方式实现全局 loading 的代码示例:

第一步 创建服务LoadingService.ts文件

首先新建一个LoadingService.ts文件,代码如下:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class LoadingService {
  private isLoading$ = new BehaviorSubject<boolean>(false);
  private message$ = new BehaviorSubject<string>('正在加载中...');

  constructor() {}

  show(): void {
    this.isLoading$.next(true);
  }

  hide(): void {
    this.isLoading$.next(false);
  }
  setMessage(message: string): void {
    this.message$.next(message);
  }

  get isLoading(): BehaviorSubject<boolean> {
    return this.isLoading$;
  }
  get message(): BehaviorSubject<string> {
    return this.message$;
  }
}

第二部,在app.component.html

增加以下代码,用于loading的展示。

<div *ngIf="loadingService.isLoading | async" class="loading-overlay">
    <div class="spinner"></div>
    <div *ngIf="loadingService.message | async" class="loading-message">{{loadingService.message.getValue()}}</div>
</div>

第三部,在app.component.scss

设置loading的样式
!注意!这里的background,url我注释掉了,需要各自换成自己项目中的loading图片

.loading-overlay {
  position: fixed;
  z-index: 9999;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.7);
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

.spinner {
  width: 150px;
  height: 150px;
  border-top: 4px solid #fff;
  border-bottom: 4px solid #fff;
  border-left: 4px solid rgba(255, 255, 255, 0.2);
  border-right: 4px solid rgba(255, 255, 255, 0.2);
  animation: spin 1s linear infinite;
//   background:url("src/assets/img/logo.1.gif") no-repeat center center;
  background-size: cover;
}

.loading-message {
  color: #fff;
  font-size: 14px;
  margin-top: 10px;
  display: block;
}

第四部,在app.component.ts

在主文件的ts里面,挂载刚刚写的LoadingService服务,代码如下。

import { Component } from '@angular/core';
import { LoadingService } from './loading.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
	//依赖注入
	constructor(public loadingService: LoadingService) {
		//挂载到window上
		window['nx_loading']=this.loadingService
	}
}

至此,你的全局loading就挂载好了,下面在业务组件里使用

业务组件的使用非常简单,只有两行代码

  • 开始loading:window[‘nx_loading’].show();
  • 关闭loading:window[‘nx_loading’].hide();

伪代码demo如下:

在这里插入图片描述

他的展示效果如下(动图):

在这里插入图片描述

最后

关于angular的文章,可以查看我的主页。也可以访问我的博客如下

  • angular框架简介基础与使用(全文2w8字)前端框架angular
  • angular框架表格自定义导出
  • 我的博客笔记

over bye~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+appium自动化测试-调用服务器接口

当前很多APP登录都需要绑定手机号&#xff0c;但当我们需要足够多的模拟新用户的注册登录时&#xff0c;无法提供大量的手机号来测试&#xff0c;所以可以让服务器给出一个清除账号的接口&#xff0c;在写自动化脚本的时候可以调用这个接口&#xff0c;保证能够使用一个账号进行…

pycharm的基本使用

废话文学 本人记录笔记始终遵循“能动手绝不动脑&#xff0c;能动脑绝不动手”的基本原则。不会的操作&#xff0c;跟着笔记干就完事了&#xff0c;还动啥脑袋&#xff1f;留着脑细胞刷抖音擦边小姐姐他不香吗&#xff1f; 什么是IDE IDE即【集成开发环境】&#xff0c;Inte…

【Algorithm】Java刷题中要熟练使用的容器Api、Stream流、Lambda表达式

Java刷题中要熟练使用的Stream流、Lambda表达式、容器Api 1.Stream流1.概述2.分类3.具体用法流的常用创建方法 2.Lambda表达式函数式接口Lambda书写语法方法引用 3.各类Api 1.Stream流 1.概述 Stream Api是「集合操作」的一种简化表达形式。其特点是惰性求值&#xff0c;流在…

maven repositories更新失败

在项目的pom文件中添加以下配置 <repositories><repository><id>alimaven</id><name>Maven Aliyun Mirror</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url><releases><enabled>tr…

视频批量剪辑软件开发源码+SaaS

工具能力 API 描述 上传素材接口 开发者可通过本接口将使用素材上传至抖音服务器。 上传临时素材接口 上传临时素材接口。 获取素材列表接口 获取素材列表接口。 删除素材接口 删除素材接口。 小程序接口能力 获取小程序接口能力。 模拟webhook事件 模拟webhook事…

基于Python的接口自动化-HTTP接口基本组成和网页构成

目录 引言 1、HTTP简介 2、HTTP原理和网页基础 2.1、 HTTP基本原理 2.2、 HTTP请求过程 2.3、 网页构成 【自动化测试工程师学习路线】 引言 在我们进行接口测试时&#xff0c;了解HTTP接口的基本组成和网页构成是非常重要的。 而Python作为一门功能强大、易学易用的编程…

亚马逊美国站 解压神器减压小玩具CPC认证

解压玩具又称减压玩具Relaxing toys&#xff0c;包括挤压、摔砸、揉捏、旋转等多种类型&#xff0c;主要供成年人使用&#xff0c;帮助释放压力。 当提到解压玩具时&#xff0c;通常指的是一类旨在缓解压力、放松心情的小型玩具。以下是几种常见的解压玩具及其简要介绍&#x…

一键开启GPT 平行时空模式

不知道大家日常使用GPT的时候&#xff0c;在一次会话中是如何完成同类任务的对话的? 简单点来说&#xff0c;假设你已经完成了角色设定&#xff0c;比如你设定GPT是一名文案编辑&#xff0c;那么接下来你会多次给它提交稿件让它进行编辑&#xff0c;那么在多次提交的时候&…

基于jsp+mysql+Spring+mybatis+VUE的SpringBoot电影院会员积分管理系统

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…

【剑指offer专项突破版】数组篇——“C“

文章目录 前言一 . 排序数组中两个数字的和题目分析思路分析法①代码——双指针法②代码——二分查找 二. 数组中和为 0 的三个数题目分析问题转换代码 三. 和大于等于 target 的最短子数组题目分析思路分析代码 四. 乘积小于 K 的子数组题目分析思路分析代码 五. 和为 k 的子数…

2023 年前端 Web 发展趋势

虽然就个人观点&#xff0c;我觉得 Web 开发在最近几年都没什么进展&#xff08;2016 年至 2021 年&#xff09;&#xff0c;但在刚刚过去的 2022 年中确实又出现了一些新的技术。在本文中&#xff0c;我想跟大家聊聊自己看到的最新 Web 开发的发展趋势。相信这波浪潮会继续激发…

PLC采集串口被占用、网口被占用,网络IP地址不能修改、多台设备IP不同网段等问题解决方案

在我们数据采集项目中&#xff0c;经常碰到端口被串口被触摸屏占用&#xff0c;网口被占用&#xff0c;修改IP增加风险&#xff0c;另外增加新的端口需要通过PLC的编程软件组态&#xff0c;涉及到上传下载PLC程序&#xff0c;耗时耗力很不方便。以下是我们总结的项目中解决办法…

JVM-对象布局

JVM中对象布局 通过引入JOL工具&#xff0c;查看对象在JVM中的布局。 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.14</version></dependency>对象的在JVM中的基本信息 普通…

iconfont字体的引用

官网&#xff1a;giconfont-阿里巴巴矢量图标库iconfont-国内功能很强大且图标内容很丰富的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能。阿里巴巴体验团队倾力打造&#xff0c;设计和前端开发的便捷工具https://www.iconfont.cn/1. 搜索图标&#xff0…

【正点原子STM32连载】 第三十章 ADC实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十…

2023最新项目管理软件排行榜!快来了解各大品牌优缺点

项目管理是一个复杂而又多样化的过程。在这个过程中&#xff0c;管理者需要处理大量的信息&#xff0c;规划资源&#xff0c;分配任务和监督进展。为了更好地管理项目&#xff0c;许多企业和组织开始采用项目管理软件。这些软件不仅可以帮助管理者更好地处理信息&#xff0c;还…

让你不再疑惑怎么转换音频格式

你是否有过这样的经历&#xff1f;听到了一首喜欢的歌曲&#xff0c;但是只能在特定的平台或设备上播放&#xff0c;因为它只存在于视频网站或某个应用程序中。或者你想要将一首歌曲作为铃声或者用于其他用途&#xff0c;但是音频文件的格式却不被平台所支持。这是&#xff0c;…

3D数字孪生技术在水利工程上面的应用价值

"农功今可济,水利更毋隳。”水利作为国民经济稳定和谐的重要部分&#xff0c;运用科技化手段对水利项目进行管理&#xff0c;能完美契合智慧水利灾害管理与防治所需。深圳华锐视点利用数字孪生和三维可视化技术搭建的智慧水利可视化管理平台&#xff0c;通过web3d开发建模…

软考A计划-系统架构师-官方考试指定教程-(10/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

传统ERP软件如何SaaS化?

01 ERP和SaaS ERP概念 企业资源计划 (ERP) 系统是许多企业的主干&#xff0c;助力管理整个企业内的会计、采购流程、项目等。对于许多 IT 部门而言&#xff0c;ERP 系统通常意味着大型、昂贵且耗时的部署&#xff0c;并可能需要进行大量硬件或基础设施投资。然而&#xff0c;云…