理解 Angular 服务
理解 Angular 服务
本文写于 2021 年 3 月 29 日
什么是服务
angular 的最佳实践推荐业务逻辑要尽量分门别类的抽离为一个个的 Service。
那么到底什么是 Service 呢?
service 意为服务,是一个广义的概念。
例如:饭馆提供的是吃饭服务、澡堂提供的是洗澡服务、学校提供的是授课服务……
那么对于写代码来说,服务是什么呢?
服务一般会包括值/状态、函数或各种特性,在 Angular 中,我们使用一个 class 来包裹这些。
但实际上,服务可以不是一个类,例如 React 的 context,通过闭包得到的返回值也可以是一个服务。
归根结底,可以这么总结:把一系列高度聚合的代码放到一起,就是一个服务。
对于前端来说,操心的事情其实有两件:
- 用户体验(动画、跳转、样式……)
- 业务逻辑与状态管理
Angular 推荐我们将第二点放到服务中来完成,从而令组件可以专心的负责用户体验。
比如从服务器获取数据、验证用户输入、日志……都应该放在服务,而不是特定的组件中。
当我们将这些委托给了各种可注入的服务之后,就可以将其注入到各个组件或者其他服务中进行调用。让你的代码更具适应性。
在 Angular 中,服务通常是一个单例。
服务写法
代码来自 Angular 官方文档,有删改
// 省略 @Injectable 代码
export class Logger {
log(msg: any) {
console.log(msg);
}
error(msg: any) {
console.error(msg);
}
warn(msg: any) {
console.warn(msg);
}
}
在 ng 组件或是 service 的构造函数中注入服务(框架会帮我们自动完成)后即可在其他方法中调用。
// 省略 @Injectable 代码
export class HeroService {
constructor(private logger: Logger) {}
getHeroes() {
this.getXXXXData().then((res: any) => {
this.logger.log(`Fetched data: ${res}`);
});
}
}
原理简述
当 Angular 创建组件类的新实例时,框架会查看该组件类的 constructor,得到该组件依赖哪些服务或其它依赖项。
如果发现了某个组件依赖某个服务,框架会首先检查注入器中是否已经有了那个服务的实例。如果存在,直接返回;如果不存在,注入器就会使用以前注册的服务提供者来创造一个,并把它加入注入器中,最后把该服务返回。
提供服务
服务需要「提供」,才能使用。
1. 在服务中注册
@Injectable({
providedIn: "root",
})
export class SomeService {}
默认情况下,服务会提供给 root,也就是根。这样该服务就可以在任何 module 的组件进行注入。
这种在 @Injectable 元数据中注册提供者的方式还让 Angular 能够通过移除那些从未被用过的服务来优化大小。
2. 在 module 中注册
@NgModule({
providers: [
AService,
BService
],
...
})
你也可以提供给单独的 module,让 service 只能在该 module 使用。
3. 在组件中注册
@Component({
selector: 'app-hero-list',
templateUrl: './hero-list.component.html',
providers: [ SomeService ]
})
当你在组件级注册提供者时,你会为该组件的每一个新实例提供该服务的一个新实例!!!
所以不推荐这么做。
该在哪里注入服务
Angular 使得我们可以在任何的组件中注入服务,这会使得我们“滥用”注入。
这里我们借用一些 react-redux 中的概念——展示组件和容器组件。
在展示组件中,应该只负责定义自己需要的状态、方法,具体的依赖于外层传入。
在容器组件中,才可以注入服务进行操作。
这样能有效的降低组件对于特定服务的依赖。
(完)
理解 Angular 服务的更多相关文章
- (七)理解angular中的module和injector,即依赖注入
(七)理解angular中的module和injector,即依赖注入 时间:2014-10-10 01:16:54 阅读:63060 评论:1 收藏:0 [点 ...
- 理解angular中的module和injector,即依赖注入
理解angular中的module和injector,即依赖注入 依赖注入(DI)的好处不再赘言,使用过spring框架的都知道.angularjs作为前台js框架,也提供了对DI的支持,这是java ...
- angular服务二
angular服务 $http 实现客户端与服务器端异步请求 get方式 test.html <!DOCTYPE html> <html lang="en"> ...
- angular服务一
angular服务 [$apply()] jquery内数据绑定 要用$apply(),不然不能在js内通过angular绑定数据 <!DOCTYPE html> <html lan ...
- angular 服务 service factory provider constant value
angular服务 服务是对公共代码的抽象,由于依赖注入的要求,服务都是单例的,这样我们才能到处注入它们,而不用去管理它们的生命周期. angular的服务有以下几种类型: 常量(Constant): ...
- 第217天:深入理解Angular双向数据绑定的原理
一.理解angular双向数据绑定 双向绑定是新的前端框架中频繁出现的一个新词汇,也是mvvm的核心原理.angularjs五条核心信念中的数据驱动,便是由双向绑定进行完成. 那么什么是双向绑定,下面 ...
- Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构
Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留 ...
- 理解Angular中的$apply()以及$digest()
$apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...
- 深入理解Angular中的$Apply()以及$Digest()
$apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...
随机推荐
- BUG战斗史 —— 日期格式与字符串之间的转换
说在前面 最近在公司实习,接触了一个中小型的后台管理系统,不得不说,项目的目录结构比我平时做的"课程设计"要来得复杂,于是我先去看了Github上一些后台管理系统的模板项目 在gu ...
- 那是我在夕阳下的code
布局何如让一个标签上下左右都居中?这有什么难的,给定子标签的宽,再让它的边距上下为0,左右为auto;如下: .child{width:10px;margin:0 auto;}//子标签 它就可以左右 ...
- 深入解析 float
0.前言 float属性在css2中是一个热门的属性,被广泛应用于布局之中,同时由于不当使用float带来的问题也非常多,本文结合自己对float的理解以及实际项目中碰到float的相关问题,做一个详 ...
- 一个命令完成[打包+同步七牛cdn+上传服务器]
webpack+gulp+qshell+npm-scripts实现一个命令完成[打包+同步cdn+上传服务器] 说明 由于我们用的七牛云存储,所以cdn也是走的七牛,所以并不适用于其他的cdn,但是思 ...
- C2678 二进制“<”: 没有找到接受“const ***”类型的左操作数的运算符解决办法
正确代码如下:#include<iostream> #include<string> #include<map> using namespace std; /*仿函 ...
- 安装并使用Junit
在Eclipse中配置Junit的方法有两种方式: 第一种方法: 1.下载junit的jar包,目前它的版本是junit3.8.1,可以从www.junit.org上下载. 2.在要使用Junit的p ...
- final,finally和finalize的区别
package com.heima.test; public class Test1 { /** * * A:面试题1 * final,finally和finalize的区别 * fina ...
- 利用window对象自带atob和btoa方法进行base64的编码和解码
项目中一般需要将表单中的数据进行编码之后再进行传输到服务器,这个时候就需要base64编码 现在可以使用window自带的方法window.atob() 和 window.btoa() 方法进行 ...
- 关于javaweb学习终点的一些感悟
学习完javaweb后,自己做了一套管理项目,使用了mybatis,themeleaf和servlet.大致明白了servlet的真实应用场景. 说白了servlet就是用来指定浏览器url后面输入了 ...
- Java学习day4
今天学习了String以及StringBuider 其中较为重点的除了用法以外,还有,String对象以""方式给出的字符串,只要字符序列相同(即顺序和大小写)无论在代码中重复几次 ...