浅谈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 相关文章推荐
javascript 清空form表单中某种元素的值
Dec 26 Javascript
JS时间选择器 兼容IE6,7,8,9
Jun 26 Javascript
jquery getScript动态加载JS方法改进详解
Nov 15 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
Jan 02 Javascript
node.js中的querystring.parse方法使用说明
Dec 10 Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 Javascript
Angular ng-class详解及实例代码
Sep 19 Javascript
jQuery Pagination分页插件使用方法详解
Feb 28 Javascript
详解Vue路由钩子及应用场景(小结)
Nov 07 Javascript
vue调试工具vue-devtools安装及使用方法
Nov 07 Javascript
QML实现圆环颜色选择器
Sep 25 Javascript
让Vue响应Map或Set的变化操作
Nov 11 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/10/09 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
JS制作简单的三级联动
2015/03/18 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Python多线程编程(五):死锁的形成
2015/04/05 Python
python自定义类并使用的方法
2015/05/07 Python
Python在线运行代码助手
2016/07/15 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
django queryset相加和筛选教程
2020/05/18 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
矿泉水广告词
2014/03/20 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
R9700摩机记
2022/04/05 无线电