2017-01-04 6 views
1

У меня есть класс обслуживания и специализированные классы обслуживания и общий компонент, который должен использовать либо специализированную службу, в зависимости от модуля.класс специализации во время инъекции зависимостей

У меня UpdateFormComponent в SharedModule - общий для всех остальных модулей в приложении. Во время создания экземпляра я должен передать потомок AbstractSaveService - Module1SaveService и Module2SaveService. Эти услуги объявлены в других модулях Module1 и Module2.

Так структура файла будет

\shared\shared.module.ts 
     update.form.component.ts 
     abstract.service.ts 
\module1\save1.service.ts (extends AbstractSaveService) 
     users.component.ts (use UpdateFormComponent and Module1SaveService) 
\module2\save2.service.ts (extends AbstractSaveService) 
     cameras.component.ts (use UpdateFormComponent and Module2SaveService) 
@Component({ 
    selector: 'update-form-component' 
}) 
class UpdateFormComponent { 
    constructor (private s: AbstractSaveService) {} 
} 
@Component({ 
    selector: 'users-component', 
    template: '<update-form-component></update-form-component>' // inject Module1SaveService 
}) 
export class UsersComponent {} 
@Component({ 
    selector: 'cameras-component', 
    template: '<update-form-component></update-form-component>' // inject Module2SaveService 
}) 
export class CamerasComponent {} 

Когда я показываю страницу из Module1 (UsersComponent) и нажмите кнопку пользователя Я хочу, чтобы показать UpdateFormComponent с вводят Module1SaveService. Когда я показываю страницу от Module2 (CamerasComponent) и пользовательскую кнопку нажмите, чтобы показать UpdateFormComponent с введенным Module2SaveService. Как я могу это достичь?

+0

Является ли их способ программно Knowning, какой класс вы хотите создать? В зависимости от глобальной переменной другое значение службы .... Являются ли 2 экземпляра, созданные внутри одного и того же компонента хоста? Или в двух разных хостах? – Melou

+0

@Melou Я отредактировал свой вопрос с ответами для вас. – koral

+0

Спасибо. Отвечает ли вам ответ @Gunter Zochbauer? Вот почему я спрашивал, созданы ли 2 экземпляра внутри одного и того же хост-компонента. – Melou

ответ

1

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

@Component({ 
    selector: 'parent1', 
    providers: [{provide: GeneralService, useExisting: Special1Service}], 
    template: `<my-component></my-component>` 
}) 
export class Parent1Component { 
    constructor(private generalService:GeneralService) {} 
} 
@Component({ 
    selector: 'parent2', 
    providers: [{provide: GeneralService, useExisting: Special2Service}], 
    template: `<my-component></my-component>` 
}) 
export class Parent1Component { 
    constructor(private generalService:GeneralService) {} 
} 
@NgModule({ 
    providers: [Special1Service, Special2Service] 
    ... 
}) 
export class AppModule {} 
+0

Я думаю, что мой ответ должен содержать достаточно информации о том, что возможно с помощью DI. Я думаю, вы должны просто вводить обе службы и решать внутри компонента, который использовать (или аналогичный подход). DI не обеспечивает то, что вы хотите. –

Смежные вопросы