2017-02-13 4 views
7

Могу ли я сделать это:Угловое 2: инъекции собственности вместо инъекции конструктора

export class BaseComponent { 
protected config: IConfig; 

@Inject(AppConfig) protected appConfig: AppConfig; 

constructor() 
{ 
    this.config = this.appConfig.getConfig();  
} 

вместо этого:

export class BaseComponent { 
config: IConfig; 

constructor(
    private appConfig: AppConfig, 
    ) 
{ 
    this.config = appConfig.getConfig();  
} 

Цель состоит в том, чтобы упростить конструктор подписи, поэтому все дочерние компоненты не необходимо указать appConfig в своем конструкторе. Таким образом, компоненты, которые наследует от BaseComponent, чтобы выглядеть следующим образом:

@Component({ 
    selector: 'sport-templates', 
    templateUrl: 'templates.component.html', 
    styleUrls: [ 'templates.component.scss' ], 
    encapsulation: ViewEncapsulation.None 
}) 
export class SportTemplates extends BaseComponent implements OnInit { 

    constructor() { 
     super(); 
    } 

вместо так:

@Component({ 
    selector: 'sport-templates', 
    templateUrl: 'templates.component.html', 
    styleUrls: [ 'templates.component.scss' ], 
    encapsulation: ViewEncapsulation.None 
}) 
export class SportTemplates extends BaseComponent implements OnInit { 

    constructor(appConfig: AppConfig) { 
     super(appConfig); 
    } 
+0

Вы нашли самое лучшее разрешение для инъекций конструктора? – PaladiN

+0

Я нашел ответ на свой вопрос здесь: https://stackoverflow.com/questions/42461852/angular-2-inject-service-manually Спасибо. –

ответ

0

Нет, вы не можете это сделать. Инъекционная услуга будет вводиться при вызове конструктора.

Целью является упрощение подписи конструктора.

Нет необходимости упрощать подпись конструктора. Для удобства чтения вы можете написать их в нескольких строках.

так все дочерние компоненты не должны указывать AppConfig в их конструктор

В вашем случае только классы, которые наследуют ваш класс будет доступ к этому. Но если вы имеете в виду дочерний компонент, те, которые используются в вашем компоненте, они не могут обращаться к переменным в родительском компоненте. Вам нужно пройти их.

ОБНОВЛЕНО

Ваш this.config всегда виден в унаследованных компонентов. Нет необходимости снова вводить appConfig в компонент SportTemplates.

+0

Благодарим вас за ответ. Я добавил немного разъяснений в свой вопрос. –

+0

@NikolaYankov обновленный ответ –

0

Вы можете сделать это:

myService: MyService = this.injector.get(MyService); 
constructor(private injector:Injector) {} 

Инжектор в @ угловом/ядра

+0

Пока он работает, он не похож на истинный путь. Больше похоже на шаблон Locator. Хотя я должен признать, что разница тонкая. – XOR