typescript - Angular 2 将复杂的服务注入(inject)到服务中

标签 typescript angular angular2-directives angular2-services

我有三项服务和一个组件:

  • root.service
  • abstarct-child.service
  • extend-child.service
  • app.component

root.service通过使用依赖注入(inject)来注入(inject) abstarct-child.service ,像这样:

import {Injectable} from 'angular2/core';
import {AbstractChildService} from './abstarct-child.service';

@Injectable()

export class RootService {
    constructor(private _abstractChildService: AbstractChildService) {}
    UseChildServiceDoSomethingFunction(){}  
}

abstarct-child.service看起来像这样:

import {Injectable} from 'angular2/core';

@Injectable()
export abstract class AbstractChildService {
    abstract doSomething(): any ;
}

extend-child.service看起来像这样:

import {Injectable} from 'angular2/core';
import {AbstractChildService} from './abstarct-child.service';

@Injectable()
export class ExtendChildService extends AbstractChildService{

    constructor(private _num: number) { super(); }
    doSomething() : any { return true; }
}

app.component提供root.serviceextend-child.service abstract-child.service像这样:

import {Component} from 'angular2/core';
import {Input} from 'angular2/core';
import {provide} from 'angular2/core';
import {RootService} from './root.service';
import {AbstractChildService} from './abstarct-child.service';
import {ExtendChildService} from './extend-child.service';

@Component({
    selector: 'app',
    providers: [provide(AbstractChildService, { useClass: ExtendChildService, useValue: this.num})]
})
export class AppComponent {
    @Input('given_Num') num: number;
}

我想知道如何注入(inject)extend-child.service一个对象,在本例中为 this.numapp.component

有人能发现我做错了什么吗?

谢谢。

最佳答案

我还没有完全弄清楚你想要完成什么,但是

   provide(AbstractChildService, { 
       useClass: ExtendChildService, 
       useValue: this.num})

不是有效的提供商。

您不能在一个提供程序中同时拥有 useClass useValue 参数,一次只能有一个。

您也不能在 @Component() 装饰器的提供程序中使用 this.。当装饰器被评估时,还没有 this. 可以引用的组件实例。

如果您想提供一个数字,您可以使用字符串或 OpaqueToken

provide('MyNumber', {useValue: 10}),

然后将其注入(inject)

constructor(@Inject('MyNumber') private _num: number) { super(); }

另一种方法是使用工厂

provide(ExtendedChildService, {useFactory: () => { new ExtendedChildService(10)});

但是this.仍然无法被引用。

关于typescript - Angular 2 将复杂的服务注入(inject)到服务中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36259119/

相关文章:

typescript - d3.js 和 TypeScript 编译错误

javascript - 定义 $scope 接口(interface)有什么好处

typescript - 使用 Typescript 创建自定义 Jasmine 匹配器

javascript - map 方法中的散布算子复制对象时的使用方法

angular - 在自定义验证器指令中注入(inject) ngControl,导致循环依赖

typescript - 列出类的私有(private)属性名称

angular - 获取 Angular Material 嵌套树中子节点的父节点

Angular 2 - 为什么你不能注销输入值

Angular2 - 指令在未在同一模块中声明时不起作用

angular - 如何使用 sebm google map 中的许多 map 标记动态更改缩放比例?