如何将Angular @Injectable与函数(不是类)一起使用

时间:2017-08-17 17:25:12

标签: angular typescript

我为Angular(2+)应用程序创建服务,所有文档都使用类,但我更喜欢将服务编写为函数。

这是我想要工作的东西(但不是):

import { Injectable } from '@angular/core';

export const AframeMessengerService = Injectable()(function AframeMessengerService() {
    console.log('aframe messenger');
});

有了这个,我在注入它的文件中得到了这个错误:

Cannot find name 'AframeMessengerService'.

这里有什么作用,但不是我想要的:

import { Injectable } from '@angular/core';

@Injectable()
export class AframeMessengerService {
    constructor() {
        console.log('aframe messenger');
    }
}

1 个答案:

答案 0 :(得分:1)

基本上你在这里做的一切都是正确的:

import { Injectable } from '@angular/core';

export const AframeMessengerService = Injectable()(function AframeMessengerService() {
    console.log('aframe messenger');
});

现在您需要将此添加到模块提供程序:

import { AframeMessengerService } from './a.service';

@NgModule({
  ...
  providers: [AframeMessengerService],
})
export class AppModule {}

并像这样注入:

import { AframeMessengerService } from './a.service';

@Component({
  selector: 'my-app',
  ...
})
export class AppComponent {   
  constructor(@Inject(AframeMessengerService) s) { }

需要注意的一点是,当您将服务注入AframeMessengerService时,您需要传递参数索引:

import { Inject, Injectable, Injector } from '@angular/core';

const AframeMessengerService = Injectable()(function AframeMessengerService(i) {
  console.log('aframe messenger');
});

Inject(Injector)(AframeMessengerService, null, 0);
                                         ^^^^^^^

export { AframeMessengerService };