Comment écrire un constructeur du service qui nécessite des paramètres angulaires 2?

J'ai un composant qui déclare la MetricsService service. Ce service nécessite à la fois de modules http et deux chaînes de caractères qui définit l'hôte sna, l'authentification de la clé à utiliser.

Les paramètres de service est comme suit:

@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";
    }

Le composant qui l'utilise est écrite comme suit:

export class DatavizComponent implements OnInit, OnChanges {
    constructor(
        private zms: MetricsService,
    ) { 
    }

Ma question est comment dois-je écrire le composant constructeur de sorte que le tout fonctionne, y compris la substitution de l'hôte et de la clé (mais ne pas dépasser le http)?

Remarque : Le code tel qu'il est actuellement écrit ne compile pas.

Pour être plus précis, je dirais que le composant d'application-selon les données de quelque chose comme ceci:

 export class DatavizComponent implements OnInit, OnChanges {
        constructor(
            private zms = MetricsService("http://myhost.com", "mykey"),
        ) { 
        }

Mais si cela fonctionne, comment passer http?

MISE À JOUR APRÈS LA SOLUTION PROPOSÉE:

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
        );

    }

Le composant:

@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
    ) { 
    }

Dans le constructeur, le journal sont comme suit (valeur ne sont pas transmises):

MetricsService constructor= wsAuthKey=blahblah=, wsHost=https://preprod-admin.host.ws

où il devrait afficher " abc " et "efg'.

Mais je me demande si il n'y a pas un problème avec le composant que l'utilisation de dataviz composante.
Dans cette partie, les informations suivantes ont été adoptées:

@Input() private wsAuthKey:string;
@Input() private wsHost:string;

Comme je voudrais le tag en option de préréglage de l'hôte et de la clé:

                <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>
Exactement où avez-vous l'intention de passer ces wsAuthKey et wsHost? Sont-ils spécifiques à l'application ou à l'élément particulier? Il ne regarde pas comme vous êtes en train de passer quelque chose dans votre exemple, il n'est pas clair comment cela est censé fonctionner.
Ces données sont spécifiques à l'application qui utilise le composant (bien que le service fournit les valeurs par défaut). Je m'attendais à fournir de l'intérieur de la composante? (J'ai ajouté un petit article dans la question) @estus
Bien sûr, ils ne sera pas défini dans le constructeur. Ils sont les liaisons et ne sont pas disponibles sur la construction. En outre, je ne vois aucune raison pour eux d'être liaisons (Entrée), ils ne sont pas modifiées. Cela dépend totalement de la façon dont ces valeurs sont utilisées. Est-il une vraie raison pour laquelle ces valeurs doivent être transmises par le biais de attrs, ou que vous essayez de fournir cette fonctionnalité dans le cas où si vous aurez jamais besoin? Cela permettra de rendre la chose beaucoup plus complexe. Vous devez fournir les détails sur la façon MetricsService fonctionne - il ne peut probablement pas être un singleton, par exemple.
Concernant la façon dont il devrait fonctionner: une page peut contenir plusieurs instances de dataviz de la même ou d'une autre classe (classe=même type de graphique, mais avec potentiellement des attributs différents. Les attributs peuvent être fournis dans une page de points à une infrastructure spécifique (préproduction, Devel, etc. servi par les indicateurs de service) ou comparer les mêmes mesures de différentes infrastructures. Aussi, un attribut sert de la période (jour, semaine, etc.) vous pouvez donc avoir deux dataviz de la même classe, même infra mais différente de la période sur la même page. (Je suis le portage de mon js angulaire)
Les attributs en question sont spécifiquement wsAuthKey et wsHost. Faut-il vraiment être fournies pour chaque directive? Parce qu'ils sont des obstacles évidents. Sans savoir comment ils sont utilisés dans MetricsService , il n'est pas possible de donner une réponse qualitative à la mise à jour de la question.

OriginalL'auteur Stéphane de Luca | 2017-02-22