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>
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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire les paramètres optionnels en ajoutant
@Optional()
(DI) et?
(texte dactylographié), et@Inject(somekey)
pour des valeurs primitives qui ne sont pas pris en charge en tant que fournisseur clésSi ils le sont, ils sont passés, sinon ils sont ignorés, mais DI encore peut injecter le
MetricsService
.Vous pouvez mettre les fournisseurs en le composant, si le service lui-même est également fourni dans le composant. Les valeurs doivent être fournis au même niveau que le service ou plus. Un service fourni par
AppModule
ne pouvez pas injecter des valeurs deMyComponent
.Parce que je l'ai fait, et la valeur dans la useValue fournie par le composant n'ont pas été transmis au service. - Je mettre à jour ma question, de sorte que vous pouvez voir où j'en suis maintenant @AngularFrance
Comme je l'ai dit, cela ne peut fonctionner que si la MetricsService est également fourni dans le composant. Le service fourni dans NgModule ne pouvez pas injecter des valeurs à partir d'un composant.
merci man, j'ai beaucoup cherché sur le web et dans angulaire docs et ne pas trouver quelque chose de tellement bon et simple comme celui-ci !
OriginalL'auteur Günter Zöchbauer
C'est une recette qui est décrit dans cette question en particulier. Il devrait être un service qui contient la configuration:
Dans le cas où elle doit être changée, elle peut être remplacée ou étendue pour l'ensemble du module ou composant particulier:
Il n'y a pas de réel besoin de faire
MetricsConfig
une classe dans ce cas. Il peut être un OpaqueToken valeur de fournisseur. Mais une classe peut être facilement étendu, il est facile d'injecter et déjà fournit une interface pour la saisie.OriginalL'auteur estus
De l'officiel docs: https://angular.io/guide/dependency-injection-in-action#injectiontoken
Utiliser un
@Optional
décorateur dans le constructeur:OriginalL'auteur Gus