2016-11-12 16 views
9

Mam usługa, która wymaga pewnej wartości zostać zainicjowany:Angular2 - wstrzyknąć usługę, która wymaga parametru inicjalizacji

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

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

i konsumenta:

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

Więc czy jest jakiś sposób, aby wstrzyknąć i przekazać wymagany parametr do konstruktora MyService "podczas" iniekcji zależności? Coś jak:

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

wiem, że mogę przechodzić przez zmienną i wszystko, ale interesuje się dowiedzieć, czy istnieje sposób, aby to zrobić z API.

Odpowiedz

-1

zobaczyć mojego kodu, można wprowadzić parametry usług jak ten

//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

Tworzysz instancję zamiast wstrzykiwania. Idąc tą trasą wolałbym raczej 'constructor (private myService: MyService) { myService.name = 'Angular2'; } 'aby faktycznie wstrzyknąć usługę. – gt6707a

9

Jest oficjalny sposób, że zespół kątowe zaleca się here. Zasadniczo umożliwia wstrzykiwanie statycznych klas konfiguracji.

ja z powodzeniem wdrożone go i tutaj wszystko jest odpowiedni kod:

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

Teraz możesz wprowadzić konfigurację wszędzie, bez używania nazw łańcuchów i przy użyciu interfejsu do sprawdzania statycznego.

Można oczywiście oddzielić interfejs i stałą dalej, aby móc dostarczyć różne wartości w produkcji i rozwoju np.

+2

Działa to dla znanych wartości statycznych. Jestem ciekawy, czy mogę powiedzieć Angularowi, aby utworzyć instancję z wartościami określonymi w czasie wykonywania, używając konstruktora (przyklejając się do wzorca). – gt6707a

+0

Cóż, to zwyczajna usługa. Po prostu nie nazwijmy tego usługą, a tutaj: –

+0

Update !! W Angular4 OpaqueToken jest przestarzałe i zostanie zastąpione przez InjectionToken. InjectionToken pozwala przekazać ogólny parametr typu. 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

Powiązane problemy