Je voudrais certaines variables soient accessibles partout dans un Angular 2
dans la Typescript
langue. Comment dois-je procéder pour y parvenir?
typescript
angular
supercobra
la source
la source
Uncaught ReferenceError: Settings is not defined
. La classeSettings
avec des variables statiques publiques est définie pour exporter et importée là où elle a été utilisée.Réponses:
Voici la solution la plus simple sans
Service
niObserver
:Mettez les variables globales dans un fichier et exportez-les.
Pour utiliser des globaux dans un autre fichier, utilisez une
import
instruction:import * as myGlobals from 'globals';
Exemple:
Merci @ eric-martinez
la source
import * as globs from 'globals'
export const
place deexport var
- vous voulez vraiment vous assurer que ces variables globales ne peuvent pas être modifiéesimport * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
J'aime aussi la solution de @supercobra. Je voudrais juste l'améliorer légèrement. Si vous exportez un objet contenant toutes les constantes, vous pouvez simplement utiliser es6 importer le module sans utiliser require .
J'ai également utilisé Object.freeze pour que les propriétés deviennent de vraies constantes. Si le sujet vous intéresse, vous pouvez lire cet article .
Reportez-vous au module en utilisant l'importation.
la source
Un service partagé est la meilleure approche
Mais vous devez être très prudent lors de son enregistrement pour pouvoir partager une seule instance pour l'ensemble de votre application. Vous devez le définir lors de l'enregistrement de votre candidature:
mais pas pour le redéfinir dans les
providers
attributs de vos composants:Sinon, une nouvelle instance de votre service sera créée pour le composant et ses sous-composants.
Vous pouvez consulter cette question concernant le fonctionnement de l'injection de dépendances et des injecteurs hiérarchiques dans Angular2:
Vous pouvez remarquer que vous pouvez également définir des
Observable
propriétés dans le service pour notifier certaines parties de votre application lorsque vos propriétés globales changent:Voir cette question pour plus de détails:
la source
HTTP_PROVIDERS
et similaires, ne devraient-ils pas non plus être ajoutésbootstrap()
?bootstrap()
mais en pratique, cela n'a pas d'importance. Je pense que les énumérerboostrap()
rend le code plus facile à comprendre. Un composant a des fournisseurs, des directives, un modèle. Je trouve cela surchargé sans les fournisseurs mondiaux qui y figurent également. Par conséquent, je préfèrebootstrap()
.alert(globalVar)
entraîne une erreur.Voir par exemple Angular 2 - Implémentation de services partagés
ou fournir des valeurs individuelles
la source
bootstrap()
.bootstrap()
et le composant racine sont deux choses différentes. Lorsque vous appelez,bootstrap(AppComponent, [MyService])
vous enregistrez le service dansboostrap()
etAppComponent
est le composant racine. La documentation mentionne quelque part qu'il est préférable d'enregistrer les fournisseurs (service) dans les composants racine,providers: ['MyService']
mais je n'ai encore trouvé aucun argument en faveur ou contre lebootstrap()
composant racine.Créez la classe Globals dans app / globals.ts :
Dans votre composant:
Remarque : vous pouvez ajouter le fournisseur de services Globals directement au module au lieu du composant, et vous n'aurez pas besoin d'ajouter en tant que fournisseur à chaque composant de ce module.
la source
Globals
en l'ajoutant également àproviders: [ ... ]
signifie que vous ne pouvez pas modifier une valeur à l'intérieur d'un composant, puis demander la valeur mise à jour dans un deuxième composant. Chaque fois que vous injectez,Globals
c'est une nouvelle instance. Si vous souhaitez modifier ce comportement, ne l' ajoutez pas simplement enGlobals
tant que fournisseur.@Injectable()
À mon humble avis pour Angular2 (v2.2.3), le meilleur moyen est d'ajouter des services contenant la variable globale et de les injecter dans les composants sans l'
providers
étiquette à l'intérieur de l'@Component
annotation. De cette manière, vous pouvez partager des informations entre les composants.Un exemple de service qui possède une variable globale:
Un exemple de composant qui met à jour la valeur de votre variable globale:
Un exemple de composant qui lit la valeur de votre variable globale:
la source
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
dans le fichier du module parent. Merci.Je ne connais pas le meilleur moyen, mais le moyen le plus simple si vous souhaitez définir une variable globale à l'intérieur d'un composant est d'utiliser une
window
variable pour écrire comme ceci:window.GlobalVariable = "what ever!"
vous n'avez pas besoin de le passer pour bootstrap ou l'importer ailleurs, et il est globalement accessible à tous les JS (pas seulement aux composants angular 2).
la source
C'est comme ça que je l'utilise:
global.ts
pour l'utiliser, importez simplement comme ça:
MODIFIÉ: préfixé "_" comme recommandé.
la source
Je pense que le meilleur moyen est de partager un objet avec des variables globales dans toute votre application en l'exportant et en l'important où vous le souhaitez.
Créez d'abord un nouveau fichier .ts par exemple globals.ts et déclarez un objet. Je lui ai donné un type d' objet mais vous pouvez également utiliser n'importe quel type ou {}
Après cela, importez-le
Et utilisez-le
la source
J'aime la réponse de @supercobra, mais j'utiliserais le mot-clé const car il est déjà disponible dans ES6:
la source