学习目录

本文主要给大家介绍的是关于Angular 4依赖注入之InjectToken使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:
本系列教程的开发环境及开发语言:
基础知识
OpaqueToken 简介
OpaqueToken 用于创建可在 Provider 中使用的 Token。
OpaqueToken 类的定义
export class OpaqueToken {
constructor(protected _desc: string) {}
toString(): string { return `Token ${this._desc}`; }
}
OpaqueToken 类的使用
import { ReflectiveInjector } from '@angular/core';
var t = new OpaqueToken("value");
var injector = ReflectiveInjector.resolveAndCreate([
{provide: t, useValue: "bindingValue"}
]);
injector.get(t); // "bindingValue"
InjectionToken 简介
InjectionToken 用于创建可在 Provider 中使用的 Token。
InjectionToken 类的定义
export class InjectionToken<T> extends OpaqueToken {
private _differentiate_from_OpaqueToken_structurally: any;
constructor(desc: string) { super(desc); }
toString(): string { return `InjectionToken ${this._desc}`; }
}
InjectionToken 类的使用
import { ReflectiveInjector } from '@angular/core';
var t = new InjectionToken<string>("value");
var injector = ReflectiveInjector.resolveAndCreate([
{provide: t, useValue: "bindingValue"}
]);
injector.get(t); // "bindingValue"
InjectionToken
在介绍 InjectionToken 相关内容之前,我们先回顾一下 "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())
}
}
为了能够更方便地管理与维护 apiUrl 地址,我们利用了 ValueProvider 和 Inject 装饰器。一切看起来非常顺利,但某一天假设我们引入了一个第三方库 - third-lib.ts,该文件的内容如下所示:
export const THIRD_PARTY_PROVIDERS = [
{
provide: 'apiUrl',
useValue: 'Other Url'
}
];
接着我们在 AppModule 中配置对应的 Provider 信息,具体如下:
import { THIRD_PARTY_PROVIDERS } from './third-party';
@NgModule({
...,
providers: [
{
provide: 'apiUrl',
useValue: 'http://localhost:4200/heros'
},
THIRD_PARTY_PROVIDERS
],
bootstrap: [AppComponent]
})
export class AppModule { }
当更新完上述代码,成功保存后,你会发现 http://localhost:4200/ 页面,又是空空如也了。这时如果我们打开开发者工具,切换到 Console 面板你会看到如下异常信息:
GET http://localhost:4200/Other%20value 404 (Not Found)
什么情况,我们的英雄信息的接口地址被替换了,其实真正的原因是使用字符串作为 Token 引起冲突了。那么怎么解决呢?最简单的方式是对调一下 ValueProvider 与 THIRD_PARTY_PROVIDERS 的位置。你会发现在 http://localhost:4200/ 页面,你又能看到英雄信息。当然这不能解决本质问题,因为这样会导致你引入的第三方库不能正常工作。
相信很多读者已经习惯了我的 "套路",当然要让我们的主角 - InjectionToken 出马,来解决这个问题咯。为了统一管理应用中的 Token 信息 ,我们新建一个 app.tokens.ts 文件来保存应用中的 Token 信息。
该文件的具体内容如下:
import { InjectionToken } from '@angular/core';
export const API_URL = new InjectionToken<string>('apiUrl');
接下来我们在更新一下 AppModule:
import { API_URL } from './app.tokens';
@NgModule({
...,
providers: [
{
provide: API_URL,
useValue: 'http://localhost:4200/heros'
},
THIRD_PARTY_PROVIDERS
],
bootstrap: [AppComponent]
})
export class AppModule { }
然后在更新 HeroService 服务,具体更新内容如下:
import { API_URL } from './app.tokens';
@Injectable()
export class HeroService {
constructor(private loggerService: LoggerService,
private http: Http,
@Inject(API_URL) private apiUrl) { }
}
当更新完上述代码,成功保存后,你会发现 http://localhost:4200/ 页面,又能正常显示英雄信息了。问题已经解决了,但其实这是因为我们使用了不同的 Token 。我们再来验证一个问题:
import { InjectionToken } from '@angular/core';
const API_URL = new InjectionToken<string>('apiUrl');
export const THIRD_PARTY_PROVIDERS = [
{
provide: API_URL,
useValue: 'Other value'
}
];
你会发现更新完 third-lib.ts 库,且成功保存后,在 http://localhost:4200/ 页面,还是能正常显示英雄信息。此时,我们的 Angular 4 依赖注入教程已经结束了。
我有话说
OpaqueToken 与 InjectionToken 有什么区别?
相同点
不同点
AngularJS 1.x DI 系统存在的问题
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Angular 4能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# angular4
# 依赖注入
# angularjs依赖注入
# 解决angularjs service中依赖注入$scope报错的问题
# 浅谈Angular6的服务和依赖注入
# 深入理解Angular中的依赖注入
# 深入理解Angular4中的依赖注入
# Angular 4依赖注入学习教程之Injectable装饰器(六)
# Angular基于Constructor Parameter的依赖注入方式详解
# 都是
# 你会发现
# 可在
# 第三方
# 相关内容
# 加载
# 该文件
# 正常显示
# 引入了
# 的是
# 是在
# 又是
# 你会
# 我有
# 已有
# 空空如也
# 给大家
# 再来
# 你又
# 要让
相关文章:
深入理解Android中的xmlns:tools属性
制作国外网站的软件,国外有哪些比较优质的网站推荐?
如何获取免费开源的自助建站系统源码?
临沂网站制作公司有哪些,临沂第四中学官网?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
建站主机无法访问?如何排查域名与服务器问题
建站之星备案是否影响网站上线时间?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
建站之星2.7模板快速切换与批量管理功能操作指南
建站主机SSH密钥生成步骤及常见问题解答?
装修招标网站设计制作流程,装修招标流程?
如何用IIS7快速搭建并优化网站站点?
小型网站制作HTML,*游戏网站怎么搭建?
定制建站流程步骤详解:一站式方案设计与开发指南
如何快速生成橙子建站落地页链接?
建站之星如何保障用户数据免受黑客入侵?
如何快速查询网址的建站时间与历史轨迹?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
深圳网站制作案例,网页的相关名词有哪些?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
如何快速搭建高效香港服务器网站?
C#如何序列化对象为XML XmlSerializer用法
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何零成本快速生成个人自助网站?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
制作旅游网站html,怎样注册旅游网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
建站为何优先选择香港服务器?
高性价比服务器租赁——企业级配置与24小时运维服务
如何快速生成凡客建站的专业级图册?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
如何选择网络建站服务器?高效建站必看指南
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
建站之星后台管理系统如何操作?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何通过多用户协作模板快速搭建高效企业网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
公司门户网站制作流程,华为官网怎么做?
在线制作视频的网站有哪些,电脑如何制作视频短片?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
建站之星如何通过成品分离优化网站效率?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
*请认真填写需求信息,我们会在24小时内与您取得联系。