2017-01-04 24 views
1

我有一般服務類和專用服務類以及應該使用專門服務的通用組件,具體取決於模塊。依賴注入期間的專門化類

我有UpdateFormComponent in SharedModule - 適用於所有其他應用模塊。在實例化過程中,我應該通過AbstractSaveService - Module1SaveServiceModule2SaveService的後裔。這些服務在其他模塊Module1Module2中聲明。

所以文件的結構將是

\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 {} 

當我顯示來自Module1UsersComponent)頁面,用戶按下按鈕,我想展示UpdateFormComponent與注入Module1SaveService。當我從Module2CamerasComponent)和用戶按下按鈕的顯示頁面時,我想顯示UpdateFormComponent並注入Module2SaveService。我怎樣才能做到這一點?

+0

是他們編程knowning你想創建哪一類的方法嗎?取決於全局變量,另一個服務值.... 是否在同一個主機組件內創建了2個實例?或在兩個不同的主機? – Melou

+0

@Melou我已經爲你編輯了我的問題和答案。 – koral

+0

謝謝。 @Gunter Zochbauer的答案對你來說可以嗎?這就是爲什麼我問是否在同一主機組件內創建了2個實例。 – Melou

回答

1

您可以將Special1Service添加到一個MyComponentSpecial2Service的父級的提供商,以供其他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不提供你想要的。 –