浅谈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 相关文章推荐
让回调函数 showResponse 也带上参数的代码
Aug 13 Javascript
Jquery知识点三 jquery表单对象操作
Jan 17 Javascript
jquery限制输入字数,并提示剩余字数实现代码
Dec 24 Javascript
JavaScript中数组对象的那些自带方法介绍
Mar 12 Javascript
Javascript函数式编程语言
Oct 11 Javascript
angular2使用简单介绍
Mar 01 Javascript
js实现带简单弹性运动的导航条
Feb 22 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
Dec 13 Javascript
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
Nov 14 Javascript
Node.js API详解之 assert模块用法实例分析
May 26 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提取中文首字母
2008/04/09 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
fetch 如何实现请求数据
2018/12/20 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
Python中下划线的使用方法
2015/03/27 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python格式化输出%s和%d
2018/05/07 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
python文件编写好后如何实践
2020/07/07 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
投标承诺书怎么写
2014/05/24 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
工程质量保证书
2015/05/09 职场文书
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫