在Angular2的服务中注入服务
原文地址:http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html 如果你关注我们的文章 Angular2中的依赖注入,你知道DI系统在Angular中是如果运作的,它利用在我们代码上通过注解添加metadata来获取所有关于依赖的信息来解决我们的依赖关系 Angular 2 应用基本上可以用任何语言编写。只要它以某种方式编译成JavaScript,当我们使用Typescript编写我们应用时,我们使用decorator来给我们代码添加metadata,有时,我们甚至忽略一些decorator,单纯依靠类型注释。然而,事实证明,当涉及到DI,我们可能注入依赖到服务时遇到意外的行为。 本文讨论了这个意外的问题,为什么它存在,以及如何解决。 注入服务依赖比方说我们有一个简单的Angular 2 组件有一个DataService依赖,它可能是这个样子: @Component({ selector: 'my-app' }) @View({ directives: [NgFor],template: ` <ul> <li *ng-for="#item in items">{{item.name}}</li> </ul> ` }) class AppComponent { items:Array<any>; constructor(dataService: DataService) { this.items = dataService.getItems(); } }
另一方面 DataService 是一个简单的类(因为它在Angualr2是一个服务),它提供了一个方法返回一些items class DataService {
items:Array<any>;
constructor() {
this.items = [
{ name: 'Christoph Burgdorf' },{ name: 'Pascal Precht' },{ name: 'thoughtram' }
];
}
getItems() {
return this.items;
}
}
当然,为了能使用 bootstrap(AppComponent,[DataService]);
到现在为止没有什么新的内容,如果这对你来说是新内容,你可能需要先阅读我们的Angular2中的依赖注入文章。 那么问题在那里呢? 这个问题发生在当我们试图注入一个依赖进我们的服务,比如,我们可以使用 import {HTTP_PROVIDERS} from 'angular2/http';
...
bootstrap(AppComponent,[HTTP_PROVIDERS,DataService]);
Angular import {Http} from 'angular2/http';
class DataService {
items:Array<any>;
constructor(http:Http) {
...
}
...
}
轰. 这个东西会爆炸。当我们在浏览器中运行这段代码,我们会得到以下错误: Cannot resolve all parameters for DataService(?). Make sure they all have valid type or annotations.
这错误基本上的意思是,它不能解决 不,我们提供了,不幸的是,这是不够的,但是 在我们的 在我们的Annotation和Decorator之间的区别文章,我们获悉, function AppComponent(myService) {
...
}
AppComponent = __decorate([
Component({...}),View({...}),__metadata('design:paramtypes',[DataService])
],AppComponent);
我们可以清楚地看到,
这看起来很不错。让我们来看看被编译后的 DataService = (function () {
function DataService(http) {
...
}
return DataService;
})();
哎呀。显然,在这里没有任何 当设置了 这就是为什么 强制生成metadata那么我们如果才能强制TypeScript为我们生成 我们可以改变我们的 import {Inject} from 'angular2/core';
import {Http} from 'angular2/http';
class DataService {
items:Array<any>;
constructor(@Inject(Http) http:Http) {
...
}
...
}
问题解决。事实上,如果查看经过编译后的代码时会发现已生成需要的 function DataService(http) { } DataService = __decorate([ __param(0,angular2_1.Inject(Http)),__metadata('design:paramtypes',[Http]) ],DataService);
我们基本上可以在我们代码上做任何 当然。在一个类上使用一个 我们所要做的就是导入它,把它放在我们的 import {Injectable} from 'angular2/core';
import {Http} from 'angular2/http';
@Injectable()
class DataService {
items:Array<any>;
constructor(http:Http) {
...
}
...
}
同样,它只是强制TypeScript发射需要的 转自:http://zai.io/topic/detail/news/46771aece0c90bcc(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |