【问题标题】:Angular 2 one service for all appAngular 2 为所有应用提供一项服务
【发布时间】:2017-04-13 21:44:30
【问题描述】:

我需要在我的 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');
    }
}

【问题讨论】:

  • 有一些技巧,但我认为你不应该使用它们,只需将它注入你需要的地方。
  • 使用继承怎么样?
  • @GünterZöchbauer 你能提供一些例子吗?即使它是 hacks 方式,它也可以帮助未来的读者和我更好地理解 Angular 2 DI 苯乙烯?
  • @echonax 你能举个例子吗?可能只有几行,我现在有点看不懂
  • 我想这是stackoverflow.com/questions/39038791/… 我猜还有一个,但我没找到。

标签: angular logging dependency-injection


【解决方案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 提到的其他几个不好的原因),但是如果您要使用此注入器(在您的情况下为记录器)做同样的事情,我认为这将是最好的解决方案。

完整示例:http://plnkr.co/edit/7qRjjgPI6XvOAzrKhWbV?p=preview

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多