2016-02-09 186 views
2

我想要做的是在每个组件中都有一个服务,但我不希望将它导入到所有组件中。 (很显然,如果必须的话,我会的。)Angular 2注入全局依赖关系

我认为,也许不正确,我可以做类似于当我在我的应用程序中启动HTTP_PROVIDERS,这使得它可用于HTTP(如果我是必需的没错)。

例如,在我的app.ts文件:

import { bootstrap } from 'angular2/platform/browser'; 
import { Injectable } from 'angular2/core'; 
import { HTTP_PROVIDERS } from 'angular2/http'; 
import 'rxjs/add/operator/map'; 
import { WidgetService } from './widget.service'; 
import { BuilderComponent } from './modules/builder/builder.component'; 

bootstrap(BuilderComponent, [HTTP_PROVIDERS, WidgetService]); 

我希望这将使WidgetService中的所有子/孙可用,等组件。 (BuilderComponent是几个孩子/孙子父。)

我使用@注入时注入并@Injectable不是在服务本身使用得到的错误:当使用

Uncaught ReferenceError: WidgetService is not defined

错误@Injectable在服务上,而不是使用@Inject注入它:

Cannot resolve all parameters for 'MyComponent'(NonGlobalService, ?). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'MyComponent' is decorated with Injectable.

我不知道为什么MyComponent的需要与注射装饰,但我得到了同样的错误,当我与@Injectable装饰它。

widget.service.ts

import { Injectable, NgZone } from 'angular2/core'; 

@Injectable() 
class WidgetService { 
    constructor(private _zone: NgZone) { 
    } 
    // other methods here... 
} 

export { WidgetService }; 

以及如何我试图把它注射:

class MyComponent { 
    constructor(private _nonGlobalService: NonGlobalService, 
       private _widget: WidgetService) { 
    } 
} 

总结:

  1. 你能在全球注入一个服务插入所有组件,而无需手动将其导入每个组件。 (IE:如果我需要的话,可以在任何地方使用)
  2. 如果可以,有人可以解释我做错了什么,并告诉我如何正确地做。
  3. 谢谢你的时间和答案!

回答

1

有不同的方法。

你可以创建一个包装服务,只注入这个服务。需从国外进口

export class MyComponent { 
    constructor(global:GlobalService) { 
    global.foo.doFoo(); 
    global.bar.doBar(); 
    } 
} 

这样,你不需要输入任何东西的分量

bootstrap(AppComponent, [ 
    provide('foo', { useClass: FooService }), 
    provide('bar', { useClass: BarService })]); 

export class MyComponent { 
    constructor(@Inject('foo') foo, @Inject('bar') bar) { 
    foo.doFoo(); 
    bar.doBar(); 
    } 
} 

@Injectable() 
export class FooService { 
    doFoo() {...}; 
} 

@Injectable() 
export class BarService { 
    doBar() {...} 
} 

@Injectable() 
export class GlobalService { 
    constructor(public foo:FooService, public bar:BarService) { 
    } 
} 

这里GlobalService,但我不认为这第二方法是可取的。您将不会得到任何IDE支持,因为服务的类型在MyComponent中未知。

+0

因此,如果我在引导时使用'provide'添加它们,我可以做我想要的吗?我还需要用'@ Injectable'来装饰我的全球服务吗? – Jacques

+0

实际上,当您的服务具有需要通过DI解析的构造函数参数时,必须使用@Injectable()。 Angular docs建议总是添加'@Injectable()',因为当你稍后向构造函数中添加一个参数时,它不容易出错。 –

+0

我现在只是收到“foo未定义”错误。 – Jacques