浅谈Angular6的服务和依赖注入


Posted in Javascript onJune 27, 2018

在开发中,组件一般用来写视图有关的功能,服务则写一些其他的逻辑,诸如从服务器获取数据、验证用户输入或直接往控制台中写日志等工作.

先解释两个概念:

  1. Providers(提供商):是个比较抽象的名词,我们把它想象为'图纸'更好理解一些,就比如我们想要生产汽车,就需要先有汽车的图纸,图纸上记录了生产工艺和材料尺寸之类,这样汽车才生产的出来.provider通常就是自己写的服务类.
  2. Injector(注入器):就是字面上的意思,将某一类事物注入到另一类事物中的工具.angular应用在启动时,会自动创建.

假想一个去医院看病的过程:

找医生看病判断病情,医生开处方 --> 处方交给护士 --> 护士小姐姐根据处方给你注射药物.

这里医生开的处方是providers,将处方交给护士则是将providers注册到injector,护士小姐姐是injector

angular中有很多方式可以将providers注册到injector:

@Injectable 装饰器

在服务类的 @Injectable 装饰器中

//service
  @Injectable({
    providedIn: 'root',
  })

providedIn: 'root' 告诉 Angular在根注入器中注册这个图纸.root 还可以是某一个具体的模块名.

这种方式注册,在代码编译打包时,可以执行摇树优化,这会移除所有没在应用中使用过的服务。摇树优化会使打包体积更小。

@NgModule 中的 providers

在模块的 @NgModule

//service
  @Injectable()
  //module
  @NgModule({
    providers: [
      UserService,
      { provide: APP_CONFIG, useValue: HERO_DI_CONFIG }
    ],
  })

这种方式注册,可以对图纸进行一些额外的配置.

note:在@NgModule中注册的服务,在图纸中也需要写@Injectable()装饰器

在组件中注册

在组件的 @Component 中

@Component({
  selector: 'app-heroes',
  providers: [ HeroService ]

这种方式注册,会注册到每个组件实例自己的注入器上。(多个组件会有多个注入器)

note:服务在每个注入器的范围内是单例的。 在任何一个注入器中,最多只会有同一个服务的一个实例。

不提供图纸

最常见的图纸是class,但是在配置providers: []时,也可以不提供class图纸,而是返回对象的工厂函数,或是对象字面量[{ provide: Logger, useClass: Logger }]

也可以使用useValue属性直接交付一个对象实例,[{ provide: Logger, useValue: silentLogger }]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 两日期相减,获得天数的小例子(兼容IE,FF)
Jul 01 Javascript
JSON 数字排序多字段排序介绍
Sep 18 Javascript
jqplot通过ajax动态画折线图的方法及思路
Dec 08 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
Javascript核心读书有感之语言核心
Feb 01 Javascript
jQuery实现预加载图片的方法
Mar 17 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
Aug 24 Javascript
Node.js实现兼容IE789的文件上传进度条
Sep 02 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
Ajax请求时无法重定向的问题解决代码详解
Jun 21 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 #Javascript
vue+springmvc导出excel数据的实现代码
Jun 27 #Javascript
微信小程序中使用ECharts 异步加载数据的方法
Jun 27 #Javascript
浅谈Webpack下多环境配置的思路
Jun 27 #Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
Jun 27 #Javascript
详解关于vue-area-linkage走过的坑
Jun 27 #Javascript
详解nuxt sass全局变量(公共scss解决方案)
Jun 27 #Javascript
You might like
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
Vuex 进阶之模块化组织详解
2018/01/12 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
python ubplot使用方法解析
2020/01/10 Python
Python try except finally资源回收的实现
2021/01/25 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
《一件运动衫》教学反思
2014/02/19 职场文书
法人任命书范本
2014/06/04 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
超级礼物观后感
2015/06/15 职场文书
消防宣传标语大全
2015/08/03 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
win10下go mod配置方式
2021/04/25 Golang
怎么用Python识别手势数字
2021/06/07 Python
分享几种python 变量合并方法
2022/03/20 Python