Угловой 2 впрыснуть комплекс услуг


У меня есть три службы и один компонент:

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

The 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; }
}

The app.component обеспечивает root.service и extend-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;
}

Я хотел бы знать, как я могу ввести в extend-child.service объект, в этом случай this.num из app.component?

Может ли кто-нибудь найти, что я делаю неправильно?

Спасибо.

1 2

1 ответ:

Я еще не до конца понял, чего ты пытаешься добиться, но

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

Не является допустимым поставщиком.

Вы не можете иметьuseClass и еще useValue параметр в одном провайдере, только по одному за раз.

Вы также не можете использовать this. в поставщике в @Component() декораторе. Когда декоратор оценивается, еще нет экземпляра компонента, на который this. мог бы ссылаться.

Если вы хотите указать число, вы можете использовать строку или OpaqueToken

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

И получить его инъекции

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

Другой способ-использовать фабрику

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

Но this. по-прежнему не может быть передан.