2016-11-12 83 views
9

參數的服務我已經被啓動,需要一定的價值服務:Angular2 - 注入需要初始化

@Injectable() 
export class MyService { 
    private myVals: any; 

    constructor(init : any) { 
    this.myVals = init; 
    } 
} 

和消費者:

@Component(...) 
export class MyComponent { 
    private svc: MyService; 
    constructor(private svc : MyService) { 
    } 
} 

那麼,有沒有辦法注入並在依賴注入期間將所需參數傳遞給MyService的構造函數?就像:

constructor(private svc({ // init vales }) : MyService) {} 

我知道我可以通過變量和所有,但有興趣找到是否有一種方法來從API做到這一點。

回答

-1

看我的代碼,你可以在服務這樣

//our root app component 
import {Component, NgModule, Injectable} from '@angular/core' 
import {BrowserModule} from '@angular/platform-browser' 


@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 
    </div> 
    `, 
}) 
export class App { 
    name:string; 
    private myService; 
    constructor() { 
    this.myService = new MyService('value'); 
    this.name = 'Angular2' 
    } 
} 



@Injectable() 
export class MyService { 
    private myInit:any; 

    constructor(init: any) { 
    this.myInit = init; 
    console.log('init', this.myInit); 
    } 
} 




@NgModule({ 
    imports: [ BrowserModule ], 
    declarations: [ App ], 
    bootstrap: [ App ] 
}) 
export class AppModule {} 
+2

你正在實例化而不是注入。如果走這條路線,我更願意使用'constructor(private myService:MyService){myService.name ='Angular2'; }'實際上已經注入了服務。 – gt6707a

9

注入參數有是角團隊建議here正式的方式。它基本上允許你注入靜態類型的配置類。

我已經成功地實現了它,這裏是所有相關代碼:

1)app.config.ts

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

export let APP_CONFIG = new OpaqueToken("app.config"); 

export interface IAppConfig { 
    apiEndpoint: string; 
} 

export const AppConfig: IAppConfig = {  
    apiEndpoint: "http://localhost:15422/api/"  
}; 

2)app.module.ts

import { APP_CONFIG, AppConfig } from './app.config'; 

@NgModule({ 
    providers: [ 
     { provide: APP_CONFIG, useValue: AppConfig } 
    ] 
}) 

3)your.service.ts

import { APP_CONFIG, IAppConfig } from './app.config'; 

@Injectable() 
export class YourService { 

    constructor(@Inject(APP_CONFIG) private config: IAppConfig) { 
      // You can use config.apiEndpoint now 
    } 
} 

現在,您可以在不使用字符串名稱的情況下將配置注入到每個位置,並且可以使用接口進行靜態檢查。

您當然可以分離接口和常數,以便能夠在生產和開發中提供不同的值。

+2

適用於已知的靜態值。我很好奇,如果我能告訴Angular使用構造函數(堅持模式)來實例化運行時確定的服務。 – gt6707a

+0

那麼,那是一個普通的服務。只是不要稱之爲服務,並在這裏你去:) –

+0

更新!在Angular4中,OpaqueToken已被棄用,並將被替換爲InjectionToken。 InjectionToken允許傳遞一個泛型類型參數。 1)https://stackoverflow.com/questions/41289264/what-is-in-angular-2-opaque-token-and-whats-the-point 2)https://arturas.smorgun.com /2017/06/08/inject-environment-configuration-into-service-in-angular4.html – WRDev