我想要做的是在每个组件中都有一个服务,但我不希望将它导入到所有组件中。 (很显然,如果必须的话,我会的。)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) {
}
}
总结:
- 你能在全球注入一个服务插入所有组件,而无需手动将其导入每个组件。 (IE:如果我需要的话,可以在任何地方使用)
- 如果可以,有人可以解释我做错了什么,并告诉我如何正确地做。
- 谢谢你的时间和答案!
因此,如果我在引导时使用'provide'添加它们,我可以做我想要的吗?我还需要用'@ Injectable'来装饰我的全球服务吗? – Jacques
实际上,当您的服务具有需要通过DI解析的构造函数参数时,必须使用@Injectable()。 Angular docs建议总是添加'@Injectable()',因为当你稍后向构造函数中添加一个参数时,它不容易出错。 –
我现在只是收到“foo未定义”错误。 – Jacques