2017-02-25 97 views
3

我有成分B,C,d,從A類繼承角2:注射服務手動

我想用A類服務,但我不知道怎麼把它注射,無需進它來自它的孩子。

我想什麼是正常的注射: constructor(pageName: string = null, translate: TranslateService) { 但是當我做super()建設A級,是因爲我沒有提供第二個參數拋出一個錯誤。

有沒有辦法使用Angular2注入父類?

角版本我不得不使用方法是:2.2.1

編輯:

一些示例情況: 我有很多的網頁,每個人都可以顯示一個加載器。相反,從每一個頁面,每次注射的裝載機和管理裝載機的,我想要做的:

export class BaseComponent { 
    constructor(private loader: LoadingService) {} 

    showLoading() { 
     this.loader.show(); 
    } 
} 

然後從組件本身繼承:

@Component({ 
    selector: "page-login", 
    providers: [UsersService], 
    templateUrl: "login.html" 
}) 
export class LoginPage extends BaseComponent { 
    constructor(private usersService: UsersService) { 
     super(); 
    } 
} 

現在LoginPage有一個方法showLoading從它是父母。

+0

這可能適合你:http://stackoverflow.com/questions/37117698/angular2-use-imported-libs-from-base-class/37117732#37117732。 – pixelbits

+0

@pixelbits謝謝,剛剛發現了另一個解決方法。我將TranslateService注入到應用程序中,然後將該實例保存在一個全局變量中,該變量是我數據存儲的一部分(我知道,不應該這樣做),並且它工作得很好。 – Amit

+0

我不會稱這是一個很好的模式。而你目前的例子並不反映這個問題。沒有TranslateService。相反,有showLoading方法,我沒有看到它應該在那裏的原因。 – estus

回答

8

您可以通過使用服務定位器服務來解決此問題。這很容易讓你得到任何服務,並在你的父類中使用它,而無需通過他們的孩子注入它們(因爲這可能是一個痛苦)。

因此,要利用這一點,創建一個簡單的類locator.service.ts

import {Injector} from "@angular/core"; 

export class ServiceLocator { 
    static injector: Injector; 
} 

導入這項服務在您的app.module.ts

import {ServiceLocator} from './locater.service.ts'; 

然後在你的模塊文件的構造函數(app.module.ts?),初始化這個東西,所以你可以在任何地方使用它:

export class AppModule { 
    constructor(private injector: Injector){ // Create global Service Injector. 
     ServiceLocator.injector = this.injector; 
    } 
} 

現在,用它在你的超類(你BaseComponent),只需導入服務定位

import {ServiceLocator} from './locater.service.ts'; 

,並用它喜歡:

export class BaseComponent { 
    constructor() { 
     this.loader = ServiceLocator.injector.get(LoadingService) 
    } 

    showLoading() { 
     this.loader.show(); 
    } 
} 

現在你已經注入您服務在一個可擴展的父項中,並且它可以在你的子組件中使用,而不必在super()中傳遞它。

+1

但請不要忘記,服務定位器被認爲是反模式,雖然有時是有用的。 –

+0

當你有幾個使用服務的子類(不是特定的組件,我的意思是數據模型)時,這很有用。您不需要在這些類的構造函數中擁有服務參數。多謝! – coding4fun