Dans Angular 1.x, vous pouvez définir des constantes comme ceci:
angular.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')
Quel serait l'équivalent en angulaire (avec TypeScript)?
Je ne veux simplement pas répéter l'URL de base de l'API encore et encore dans tous mes services.
typescript
angular
AndreFeijo
la source
la source
AppSettings
classe devrait être abstraite et leAPI_ENDPOINT
membre devrait l'êtrereadonly
.La solution pour la configuration fournie par l'équipe angulaire elle-même peut être trouvée ici .
Voici tout le code pertinent:
1) app.config.ts
2) app.module.ts
3) your.service.ts
Vous pouvez maintenant injecter la configuration partout sans utiliser les noms de chaîne et avec l'utilisation de votre interface pour les contrôles statiques.
Vous pouvez bien sûr séparer l'interface et la constante pour pouvoir fournir différentes valeurs dans la production et le développement, par exemple
la source
environment.ts
etenvironment.prod.ts
afin que vous puissiez avoir différentes constantes par environnement? @IlyaChernomordik a commencé à le mentionner dans le dernier paragraphe de sa réponse.Dans Angular2, vous disposez de la définition de fourniture suivante , qui vous permet de configurer différents types de dépendances:
Comparé à Angular 1
app.service
dans Angular1 est équivalent àuseClass
dans Angular2.app.factory
dans Angular1 est équivalent àuseFactory
dans Angular2.app.constant
etapp.value
a été simplifiéuseValue
avec moins de contraintes. c'est-à-dire qu'il n'y a plus deconfig
bloc.app.provider
- Il n'y a pas d'équivalent dans Angular 2.Exemples
Pour configurer avec l'injecteur racine:
Ou configurez avec l'injecteur de votre composant:
provide
est la main courte pour:Avec l'injecteur, obtenir la valeur est facile:
la source
Dans Angular 4, vous pouvez utiliser la classe d'environnement pour conserver tous vos globaux.
Vous avez par défaut environment.ts et environment.prod.ts.
Par exemple
Et puis à votre service:
la source
const
intérieur d'un service, vous devrez peut-être « fournir » dans le tableau des fournisseurs de votre module d'application:{ provide: 'ConstName', useValue: ConstName }
. J'obtenais une erreur d'exécution sans cela.Mis à jour pour Angular 4+
Maintenant, nous pouvons simplement utiliser le fichier d'environnements qui fournit par défaut angulaire si votre projet est généré via angular-cli.
par exemple
Dans votre dossier d'environnements, créez les fichiers suivants
environment.prod.ts
environment.qa.ts
environment.dev.ts
et chaque fichier peut contenir des modifications de code liées telles que:
environment.prod.ts
environment.qa.ts
environment.dev.ts
Cas d'utilisation dans l'application
Vous pouvez importer des environnements dans n'importe quel fichier tel que les services
clientUtilServices.ts
import {environment} from '../../environments/environment';
Cas d'utilisation dans la construction
Ouvrez votre fichier cli angulaire
.angular-cli.json
et"apps": [{...}]
ajoutez à l' intérieur le code suivantSi vous souhaitez construire pour la production, exécutez
ng build --env=prod
-le lira la configuration de laenvironment.prod.ts
même manière que vous pouvez le faire pourqa
oudev
## Réponse plus ancienne
J'ai fait quelque chose comme ci-dessous, dans mon fournisseur:
Ensuite, j'ai accès à toutes les données constantes n'importe où
la source
API_ENDPOINT
valeur peut être écrasée à tout moment. Sithis.ConstantService.API_ENDPOINT = 'blah blah'
est déclaré dans la classe à tout moment après que votre soi-disant "constante" soit importée deconstant-service
, la nouvelle valeur de API_ENDPOINT serait'blah blah'
. Votre solution montre simplement comment accéder à une variable en utilisant un service et non en utilisant une constante.readonly API_ENDPOINT :String;
ng build --env=prod
Bien que l'approche consistant à avoir une classe AppSettings avec une constante de chaîne pendant le fonctionnement d'ApiEndpoint, elle n'est pas idéale car nous ne serions pas en mesure d'échanger ce véritable ApiEndpoint contre d'autres valeurs au moment du test unitaire.
Nous devons être en mesure d'injecter ces points de terminaison api dans nos services (pensez à injecter un service dans un autre service). Nous n'avons pas non plus besoin de créer une classe entière pour cela, tout ce que nous voulons faire est d'injecter une chaîne dans nos services étant notre ApiEndpoint. Pour compléter l' excellente réponse par pixelbits , voici le code complet sur la façon dont cela peut être fait dans Angular 2:
Nous devons d'abord dire à Angular comment fournir une instance de notre ApiEndpoint lorsque nous le demandons dans notre application (pensez-y comme enregistrant une dépendance):
Et puis dans le service, nous injectons cet ApiEndpoint dans le constructeur de services et Angular nous le fournira en fonction de notre enregistrement ci-dessus:
la source
Voici ma récente expérience avec ce scénario:
J'ai suivi les documents officiels et mis à jour ici:
https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens
Semble OpaqueToken est maintenant obsolète et nous devons utiliser InjectionToken , donc ce sont mes fichiers qui fonctionnent comme un charme:
app-config.interface.ts
app-config.constants.ts
app.module.ts
my-service.service.ts
Le résultat est propre et il n'y a aucun avertissement sur la console grâce au récent commentaire de John Papa dans ce numéro:
https://github.com/angular/angular-cli/issues/2034
La clé a été implémentée dans un fichier différent de l'interface.
la source
Toutes les solutions semblent compliquées. Je cherche la solution la plus simple pour ce cas et je veux juste utiliser des constantes. Les constantes sont simples. Y a-t-il quelque chose qui s'oppose à la solution suivante?
app.const.ts
app.service.ts
la source
Utilisez simplement une constante Typescript
Vous pouvez l'utiliser dans l'injecteur de dépendance en utilisant
la source
const
YestSi vous utilisez Webpack , ce que je recommande, vous pouvez configurer des constantes pour différents environnements. Cela est particulièrement utile lorsque vous avez différentes valeurs constantes en fonction de l'environnement.
Vous aurez probablement plusieurs fichiers webpack sous votre
/config
répertoire (par exemple, webpack.dev.js, webpack.prod.js, etc.). Ensuite, vous aurez un,custom-typings.d.ts
vous les ajouterez là-bas. Voici le schéma général à suivre dans chaque fichier et un exemple d'utilisation dans un composant.webpack. {env} .js
custom-typings.d.ts
Composant
la source
L'utilisation d'un fichier de propriétés généré lors d'une génération est simple et facile. Il s'agit de l'approche utilisée par la CLI angulaire. Définissez un fichier de propriétés pour chaque environnement et utilisez une commande lors de la génération pour déterminer le fichier à copier dans votre application. Importez ensuite simplement le fichier de propriétés à utiliser.
https://github.com/angular/angular-cli#build-targets-and-environment-files
la source
Une approche pour Angular4 serait de définir une constante au niveau du module:
Ensuite, à votre service:
la source
J'ai une autre façon de définir des constantes globales. Parce que si nous avons défini dans le fichier ts, s'il est construit en mode production, il n'est pas facile de trouver des constantes pour changer la valeur.
Dans le dossier de l'application, j'ajoute le dossier configs / setting.json
Contenu dans setting.json
Dans le module d'application, ajoutez APP_INITIALIZER
de cette façon, je peux changer la valeur du fichier json plus facilement. J'utilise également cette méthode pour les messages d'erreur / d'avertissement constants.
la source
AngularJS's
module.constant
ne définit pas de constante au sens standard.Bien qu'il soit autonome en tant que mécanisme d'enregistrement de fournisseur, il est mieux compris dans le contexte de la fonction connexe
module.value
($provide.value
). La documentation officielle indique clairement le cas d'utilisation:Comparez cela à la documentation de
module.constant
($provide.constant
) qui indique également clairement le cas d'utilisation (c'est moi qui souligne):Par conséquent, la
constant
fonction AngularJS ne fournit pas une constante dans le sens communément compris du terme dans le domaine.Cela dit, les restrictions imposées à l'objet fourni, ainsi que sa disponibilité antérieure via l'injecteur $, suggèrent clairement que le nom est utilisé par analogie.
Si vous vouliez une constante réelle dans une application AngularJS, vous en fourniriez une de la même manière que dans n'importe quel programme JavaScript qui est
Dans Angular 2, la même technique est applicable.
Les applications Angular 2 n'ont pas de phase de configuration au même sens que les applications AngularJS. De plus, il n'y a pas de mécanisme de décorateur de service ( AngularJS Decorator ) mais cela n'est pas particulièrement surprenant étant donné leur différence.
L'exemple de
est vaguement arbitraire et légèrement rebutant car il
$provide.constant
est utilisé pour spécifier un objet qui est d' ailleurs également une constante. Vous pourriez aussi bien avoir écritcar tout le monde peut changer.
Maintenant, l'argument de la testabilité, se moquant de la constante, est diminué car il ne change littéralement pas.
On ne se moque pas de π.
Bien sûr, la sémantique spécifique à votre application pourrait être que votre point de terminaison pourrait changer, ou votre API pourrait avoir un mécanisme de basculement non transparent, il serait donc raisonnable que le point de terminaison de l'API change dans certaines circonstances.
Mais dans ce cas, la fournir sous la forme d'une représentation littérale sous forme de chaîne d'une URL unique vers la
constant
fonction n'aurait pas fonctionné.Un meilleur argument, et probablement plus conforme à la raison de l'existence de la
$provide.constant
fonction AngularJS , est que, lorsque AngularJS a été introduit, JavaScript n'avait pas de concept de module standard . Dans ce cas, les globaux seraient utilisés pour partager des valeurs, mutables ou immuables, et l'utilisation des globaux est problématique.Cela dit, fournir quelque chose comme ça via un cadre augmente le couplage avec ce cadre. Il mélange également une logique spécifique angulaire avec une logique qui fonctionnerait dans tout autre système.
Cela ne veut pas dire que c'est une approche erronée ou nuisible, mais personnellement, si je veux une constante dans une application Angular 2, j'écrirai
tout comme je l'aurais fait si j'utilisais AngularJS.
Plus les choses changent...
la source
La meilleure façon de créer des constantes à l'échelle de l'application dans Angular 2 est d'utiliser les fichiers environment.ts. L'avantage de déclarer de telles constantes est que vous pouvez les faire varier en fonction de l'environnement car il peut y avoir un fichier d'environnement différent pour chaque environnement.
la source
Vous pouvez créer une classe pour votre variable globale, puis exporter cette classe comme ceci:
Après avoir créé et exporté votre
CONSTANT
classe, vous devez importer cette classe dans la classe où vous souhaitez l'utiliser, comme ceci:Vous pouvez l'utiliser dans
constructor
oungOnInit(){}
, ou dans n'importe quelle méthode prédéfinie.la source