I have a component that declares the MetricsService
service. This service requires both HttpModule
plus two string
s that defines the host and the auth key to use.
The metrics service is as follows:
@Injectable() export class MetricsService { constructor( private http: Http, public wsAuthKey: string, public wsHost: string ) { this.wsAuthKey = wsAuthKey || "blahblahblahblahblahblahblahblah="; this.wsHost = wsHost || "https://preprod-admin.myservice.ws"; }
The component that uses it is written as follows:
export class DatavizComponent implements OnInit, OnChanges { constructor( private zms: MetricsService, ) { }
My question is how should I write the component constructor so that the whole thing works, including passing the host and key (but not passing the http)?
Note : The code as currently written does not compile.
To be more precise, I would expect the component to provided app-depending data something like this:
export class DatavizComponent implements OnInit, OnChanges { constructor( private zms = MetricsService("http://myhost.com", "mykey"), ) { }
But if this works, how to pass http?
UPDATE AFTER PROPOSED SOLUTION:
export class MetricsService { constructor( private http: Http, @Inject('wsAuthKey') @Optional() public wsAuthKey?: string, @Inject('wsHost') @Optional() public wsHost?: string ) { this.wsAuthKey = wsAuthKey || "blahblah="; this.wsHost = wsHost || "https://preprod-admin.host.ws"; console.log("MetricsService constructor=" + " wsAuthKey="+this.wsAuthKey + ", wsHost="+this.wsHost ); }
In the component:
@Component({ selector: 'dataviz-offers-volumes', templateUrl: 'app/dataviz.component.html', styleUrls: ['app/dataviz.component.css'], encapsulation: ViewEncapsulation.None, providers: [ {provide: 'wsAuthKey', useValue: 'abc'}, {provide: 'wsHost', useValue: 'efg'}, ], }) export class DatavizComponent implements OnInit, OnChanges { @ViewChild('chart') private chartContainer: ElementRef; @Input() private graphId:string; @Input() private wsAuthKey:string; @Input() private wsHost:string; @Input() private maxSamples=12; constructor( private zms: MetricsService ) { }
In the constructor, the log are as follows (value are not passed):
MetricsService constructor= wsAuthKey=blahblah=, wsHost=https://preprod-admin.host.ws
where it should show 'abc' and 'efg'.
But I wonder if there is not an issue with the component that use dataviz componenet. In this component, the following information have been passed:
@Input() private wsAuthKey:string; @Input() private wsHost:string;
As I would like the tag to optionally preset the host and key:
<h1>dataviz volume</h1> <div class="chartContainer left" title="Simultaneous offers via dataviz directive"> <dataviz-offers-volumes id="dataviz-volumes1" [graphId]="graphId" [wsAuthKey]="'myauthkey'" [wsHost]="'http://myhost.com'" [maxSamples]="123" > </dataviz-offers-volumes> </div>
Also, DI in our Angular components/services can be implemented using either constructor or injector.
If you want to pass additional parameters to an Angular service, what you are looking for is @Inject decorator. It helps you pass your parameters to the service through Angular's dependency injection mechanism. @Inject() is a manual mechanism for letting Angular know that a parameter must be injected.
Parameterized Constructor – A constructor is called Parameterized Constructor when it accepts a specific number of parameters. To initialize data members of a class with distinct values.
This method has four parameters: the loan amount, the interest rate, the future value and the number of periods.
You can make the parameters optional by adding @Optional()
(DI) and ?
(TypeScript), and @Inject(somekey)
for primitive values that are not supported as provider keys
@Injectable() export class MetricsService { constructor( private http: Http, @Inject('wsAuthKey') @Optional() public wsAuthKey?: string, @Inject('wsHost') @Optional() public wsHost?: string ) { this.wsAuthKey = wsAuthKey || "blahblahblahblahblahblahblahblah="; this.wsHost = wsHost || "https://preprod-admin.myservice.ws"; }
providers: [ {provide: 'wsAuthKey', useValue: 'abc'}, {provide: 'wsHost', useValue: 'efg'}, ]
If they are provided, they are passed, otherwise they are ignored, but DI still can inject the MetricsService
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With