【问题标题】:Angular 2 Inject complex service to serviceAngular 2 将复杂的服务注入到服务中
【发布时间】:2016-07-15 12:31:55
【问题描述】:

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

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

root.service 使用依赖注入注入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 as 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;
}

我想知道如何向extend-child.service 注入一个对象,在本例中是app.componentthis.num

谁能发现我做错了什么?

谢谢。

【问题讨论】:

    标签: typescript angular angular2-directives angular2-services


    【解决方案1】:

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

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

    不是有效的提供者。

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

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

    如果要提供数字,可以使用字符串或OpaqueToken

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

    并让它注入

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

    另一种方法是使用工厂

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

    但是this.仍然不能被推荐。

    【讨论】:

    • 如您所见,extend-child.service 通过依赖注入获取数字对象,我不会将数字注入extend-child.service,然后将extend-child.service 注入root.service。也许我这是一个坏方法,所以如果有人知道它是正确的方法吗?
    • 正如我的回答中提到的,你不能只通过它的类型注入一个数字。对于原始类型,您需要一个与类型不同的键并将@Inject('someKey') 添加到构造函数参数。否则 DI 将无法区分多个提供的 string (number, boolean, ...) 值。
    • 嗯,我得到了你的答案,问题是我的app.component需要注入num参数,当num参数被注入到app.component时。
    • 数字从何而来?我需要有关您尝试解决的实际问题的更多信息,以便能够提出替代方法。
    • num 是从 before-root.component 注入的,该组件通过使用 URL 上的函数获取数字。因此,如果 URL 为“www.ex.com/num=1”,则 before-root.component 将有一个名为 numFromUrl 的数字参数,并将此参数注入 html 中,如下所示
    猜你喜欢
    • 2017-08-24
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多