浅谈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 相关文章推荐
JavaScipt基本教程之前言
Jan 16 Javascript
通过原生JS实现为元素添加事件的方法
Nov 23 Javascript
微信小程序实现带刻度尺滑块功能
Mar 29 Javascript
Linux CentOS系统下安装node.js与express的方法
Apr 01 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
Jul 27 Javascript
JS实现闭包中的沙箱模式示例
Sep 07 Javascript
简单实现jQuery弹窗效果
Oct 30 jQuery
详解Node.js模板引擎Jade入门
Jan 19 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
微信小程序动态增加按钮组件
Sep 14 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
Nov 30 Javascript
深入详解JS函数的柯里化
Jun 09 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
php基础知识:函数基础知识
2006/12/13 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
php 问卷调查结果统计
2015/10/08 PHP
php实现word转html的方法
2016/01/22 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
newxtree.js代码
2007/03/13 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
python处理圆角图片、圆形图片的例子
2014/04/25 Python
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
python绘制多个子图的实例
2019/07/07 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
canvas线条的属性详解
2018/03/27 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
《雷雨》教学反思
2014/02/20 职场文书
车辆工程专业求职信
2014/06/14 职场文书
学校工作推荐信范文
2014/07/11 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
同意报考证明
2015/06/17 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
创业计划书之甜品店
2019/09/18 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL