我需要在我的Angular2应用程序中使用记录器服务,但写起来相当不舒服(我使用ES6和Angular2):
import { LoggerService } from '../services/logger-service';
...
constructor(@Inject(LoggerService) logger) {
this.logger = logger;
}
在我想要使用它的每个组件或服务中。有没有办法全局注入LoggerService
并在应用程序的任何地方使用?我还没有办法做到这一点。
这是我的记录器的外观:
import {Injectable} from '~/node_modules/@angular/core';
@Injectable()
export class LoggerService {
constructor() {
if (appConfig.dev) {
this.log = console.log.bind(console);
this.error = console.error.bind(console);
this.info = console.info.bind(console);
} else {
this.log = this.error = this.info = () => null;
}
}
}
我要在其中使用的组件示例:
import { Component, Inject } from '~/node_modules/@angular/core';
import { LoggerService } from '../services/logger-service';
@Component({
'selector': 'activities',
'template': template,
'styles': [style]
})
export class ActivitiesComponent {
constructor(@Inject(LoggerService) logger){
this.logger = logger;
}
someAction() {
this.logger.log('hello');
}
}
答案 0 :(得分:1)
如果您要在每个组件中执行相同的操作,其中一个解决方案是使用继承。
你的超级课程看起来像:
export abstract class BaseComponent implements OnInit{
ls:LoggerService;
constructor(private injector: Injector){
console.log("I'm super: inside constructor");
this.ls = this.injector.get(LoggerService);
this.ls.logger("Super Class log!");
}
ngOnInit(){
console.log("I'm super, inside OnInit");
}
}
然后你可以在你的子类构造函数中初始化你的超类,如下所示:
constructor(private injector: Injector) {
super(injector);
}
你每次都需要在构造函数中编写注入器(以及@Günter在https://stackoverflow.com/a/39038814/5706293提到的其他几个不好的原因)但是如果你打算用这个注射器做同样的事情(在你的情况下使用logger) )我认为这将是最好的解决方案。