Angular 4依赖注入学习教程之ValueProvider的使用(七)
发布时间 - 2026-01-11 01:43:03 点击率:次学习目录

- Angular 4 依赖注入教程之一 依赖注入简介
- Angular 4 依赖注入教程之二 组件服务注入
- Angular 4 依赖注入教程之三 ClassProvider的使用
- Angular 4 依赖注入教程之四 FactoryProvider的使用
- Angular 4 依赖注入教程之五 FactoryProvider配置依赖对象
- Angular 4 依赖注入教程之六 Injectable 装饰器
- Angular 4 依赖注入教程之七 ValueProvider的使用
- Angular 4 依赖注入教程之八 InjectToken的使用
前言
本文主要给大家介绍了关于Angular 4依赖注入之ValueProvider使用的相关内容,分享出来供大家参考学习,下面来一起详细的介绍:
本系列教程的开发环境及开发语言:
- Angular 4 +
- Angular CLI
- TypeScript
基础知识
ValueProvider 的作用
ValueProvider 用于告诉 Injector (注入器),但使用 Token 获取依赖对象时,则返回 useValue 指定的值。
ValueProvider 的使用
const provider: ValueProvider = {provide: 'someToken', useValue: 'someValue'};
ValueProvider 接口
export interface ValueProvider {
// 用于设置与依赖对象关联的Token值,Token值可能是Type、InjectionToken、
// OpaqueToken的实例或字符串
provide: any;
// 设置注入的对象
useValue: any;
// 用于标识是否multiple providers,若是multiple类型,则返回与Token关联的依赖
// 对象列表
multi?: boolean;
}
json-server 简介
json-server 用于基于 JSON 数据快速地创建本地模拟的 REST API。
json-server 的安装
npm install -g json-server
json-server 的使用
json-server --watch db.json
Angular CLI 代理配置
创建 proxy.conf.json 文件
{
"/heros": {
"target": "http://localhost:3000",
"secure": false
}
}
更新 package.json 文件
{
"scripts": {
"start": "ng serve --proxy-config proxy.conf.json",
}
}
ValueProvider
介绍完基础知识,我们马上进入正题。不知道大家是否还记得,在 "组件服务注入" 文章中提到的内容:
难道一切就这么结束了,No! No!别忘记了我们这节课的主题是介绍如何在组件中注入服务。在目前的 HeroComponent 组件,我们的英雄列表信息是固定的,在实际的开发场景中,一般需要从远程服务器获取相应的信息。
接下来我们将重构我们的 HeroService 服务,从 API 接口中获取英雄数据。要使用 Angular 的 Http 服务,首先需要在 AppModule 模块中导入 HttpModule ,然后在 HeroService 类的构造函数中注入 Http 服务。
更新 HeroService 服务
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import { LoggerService } from './logger.service';
@Injectable()
export class HeroService {
constructor(private loggerService: LoggerService,
private http: Http) { }
apiUrl = 'http://localhost:4200/heros';
getHeros(): Observable<Array<{ id: number; name: string }>> {
this.loggerService.log('Fetching heros...');
return this.http.get(this.apiUrl)
.map(res => res.json())
}
}
在 HeroService 服务中,我们通过注入 Http 服务对象的 get() 方法发送 HTTP 请求,从而从 API 接口中获取英雄的数据。
更新 HeroComponent 组件
import { Component, OnInit } from '@angular/core';
import { HeroService } from '../hero.service';
import { LoggerService } from '../logger.service';
@Component({
selector: 'app-hero',
template: `
<ul>
<li *ngFor="let hero of heros">
ID: {{hero.id}} - Name: {{hero.name}}
</li>
</ul>
`
})
export class HeroComponent implements OnInit {
heros: Array<{ id: number; name: string }>;
constructor(private heroService: HeroService,
private loggerService: LoggerService) { }
ngOnInit() {
this.loggerService.log('Fetching heros...');
this.heroService.getHeros()
.subscribe(res => {
this.heros = res;
});
}
}
更新完上述代码,成功保存后,你会发现 http://localhost:4200/ 页面,一片空白。这就对了,因为我们还没有启动本地的 json-server 服务器。接下来我们来配置并启动本地的 json-server 服务器:
创建 heros.json 文件
{
"heros": [
{"id":11,"name":"Mr. Nice"},
{"id":12,"name":"Narco"},
{"id":13,"name":"Bombasto"},
{"id":14,"name":"Celeritas"},
{"id":15,"name":"Magneta"}
]
}
启动 json-server 服务器
json-server --watch heros.json
当成功启动 json-server 服务器,在命令行中,你将看到以下输出信息:
\{^_^}/ hi!
Loading heros.json
Done
这表示本地 json-server 已经成功启动,此时重新刷新以下 http://localhost:4200/ 页面,你将看到以下信息:
ID: 11 - Name: Mr. Nice ID: 12 - Name: Narco ID: 13 - Name: Bombasto ID: 14 - Name: Celeritas ID: 15 - Name: Magneta
程序终于又正常运行了,但注意到 HeroService 服务中,我们通过以下方式定义 API 接口地址:
@Injectable()
export class HeroService {
...
apiUrl = 'http://localhost:4200/heros';
}
这种方式有个问题,假设其它服务也要使用该地址,那么就得按照同样的方式去定义 API 接口地址。另外假设 API 接口地址需要更新,那就需要修改多个地方。针对上述问题,我们可以使用 ValueProvider 来解决问题。
使用 ValueProvider
@NgModule({
...,
providers: [
{
provide: 'apiUrl',
useValue: 'http://localhost:4200/heros'
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
更新 HeroService 服务
@Injectable()
export class HeroService {
constructor(private loggerService: LoggerService,
private http: Http,
@Inject('apiUrl') private apiUrl) { }
getHeros(): Observable<Array<{ id: number; name: string }>> {
this.loggerService.log('Fetching heros...');
return this.http.get(this.apiUrl)
.map(res => res.json())
}
}
在 HeroService 类的构造函数中,我们通过 @Inject('apiUrl') 方式,注入 apiUrl 该 Token 对应的依赖对象,即 'http://localhost:4200/heros' 。为什么不能使用 private apiUrl: 'apiUrl' 的方式,希望读者好好回忆一下,之前我们介绍过的相关内容。
以上代码成功运行后,在 http://localhost:4200/ 页面,我们将看到预期的结果:
ID: 11 - Name: Mr. Nice ID: 12 - Name: Narco ID: 13 - Name: Bombasto ID: 14 - Name: Celeritas ID: 15 - Name: Magneta
我有话说
为什么在构造函数中,非 Type 类型的参数只能用 @Inject(Something) 的方式注入 ?
因为 Type 类型的对象,会被 TypeScript 编译器编译。即我们通过 class 关键字声明的服务,最终都会编译成 ES5 的函数对象。
在构造函数中,Type 类型的参数能用 @Inject(Type) 的方式注入么?
Type 类型的参数也能使用 @Inject(Type) 的方式注入,具体如下:
constructor(@Inject(Http) private http) { }
同样也可以使用以下方式:
constructor(@Inject(Http) private http: Http) { }
第一种方式虽然可以正常编译,但 IDE 会有如下的提示信息:
[ts] Parameter 'http' implicitly has an 'any' type.
第二种方式,虽然 Angular 内部会合并 design:paramtypes 与 parameters 内的 metadata 信息,但本人觉得是有点冗余了。 总而言之,若果是 Type 类型的参数,推荐使用下面的方式:
constructor(private http: Http) { }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Angular 4能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# angular4
# 依赖注入
# valueprovider
# angularjs依赖注入
# angular 服务的单例模式(依赖注入模式下)详解
# 深入理解Angular中的依赖注入
# Angular 4依赖注入学习教程之InjectToken的使用(八)
# AngularJS学习第二篇 AngularJS依赖注入
# AngularJS的依赖注入实例分析(使用module和injector)
# 自学实现angularjs依赖注入
# Angular.JS学习之依赖注入$injector详析
# AngularJS $injector 依赖注入详解
# 详解Angular依赖注入
# 相关内容
# 可以使用
# 你将
# 还没有
# 会有
# 有个
# 那就
# 多个
# 也要
# 我有
# 也能
# 推荐使用
# 提示信息
# 这就
# 注意到
# 给大家
# 解决问题
# 就得
# 之二
# 这篇文章
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
网站制作免费,什么网站能看正片电影?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
JavaScript如何实现错误处理_try...catch如何捕获异常?
如何在Windows 2008云服务器安全搭建网站?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
EditPlus中的正则表达式实战(5)
如何用搬瓦工VPS快速搭建个人网站?
微信小程序 input输入框控件详解及实例(多种示例)
javascript读取文本节点方法小结
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
深入理解Android中的xmlns:tools属性
php485函数参数是什么意思_php485各参数详细说明【介绍】
网易LOFTER官网链接 老福特网页版登录地址
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
如何在企业微信快速生成手机电脑官网?
浅谈Javascript中的Label语句
如何快速搭建自助建站会员专属系统?
Python文本处理实践_日志清洗解析【指导】
微信小程序 闭包写法详细介绍
如何利用DOS批处理实现定时关机操作详解
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Android自定义控件实现温度旋转按钮效果
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel Fortify是什么,和Jetstream有什么关系
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
利用vue写todolist单页应用
高端网站建设与定制开发一站式解决方案 中企动力
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
中国移动官方网站首页入口 中国移动官网网页登录
EditPlus中的正则表达式实战(6)
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel如何实现用户密码重置功能?(完整流程代码)
个人网站制作流程图片大全,个人网站如何注销?
jquery插件bootstrapValidator表单验证详解
如何在Windows虚拟主机上快速搭建网站?
PHP 500报错的快速解决方法
Laravel怎么实现模型属性的自动加密
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
无锡营销型网站制作公司,无锡网选车牌流程?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Laravel DB事务怎么使用_Laravel数据库事务回滚操作

