Ich möchte, dass einige Variablen überall Angular 2
in der Typescript
Sprache verfügbar sind. Wie soll ich das erreichen?
typescript
angular
Superkobra
quelle
quelle
Uncaught ReferenceError: Settings is not defined
. Die KlasseSettings
mit öffentlichen statischen Variablen ist auf Export eingestellt und wurde dort importiert, wo sie verwendet wurde.Antworten:
Hier ist die einfachste Lösung , w / o
Service
nochObserver
:Fügen Sie die globalen Variablen in eine Datei ein und exportieren Sie sie.
Verwenden Sie eine
import
Anweisung, um Globals in einer anderen Datei zu verwenden :import * as myGlobals from 'globals';
Beispiel:
Danke @ eric-martinez
quelle
import * as globs from 'globals'
export const
anstelle vonexport var
- Sie möchten wirklich sicherstellen, dass diese globalen Variablen nicht geändert werden könnenimport * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
Ich mag auch die Lösung von @supercobra. Ich möchte es nur leicht verbessern. Wenn Sie ein Objekt exportieren, das alle Konstanten enthält, können Sie das Modul einfach mit es6 importieren, ohne require zu verwenden .
Ich habe auch Object.freeze verwendet, um die Eigenschaften zu wahren Konstanten zu machen. Wenn Sie sich für das Thema interessieren, können Sie diesen Beitrag lesen .
Verweisen Sie das Modul mit Import.
quelle
Ein gemeinsamer Dienst ist der beste Ansatz
Sie müssen jedoch bei der Registrierung sehr vorsichtig sein, um eine einzelne Instanz für Ihre gesamte Anwendung freigeben zu können. Sie müssen es bei der Registrierung Ihrer Bewerbung definieren:
aber nicht erneut innerhalb der
providers
Attribute Ihrer Komponenten zu definieren :Andernfalls wird eine neue Instanz Ihres Dienstes für die Komponente und ihre Unterkomponenten erstellt.
Sie können sich diese Frage ansehen, wie Abhängigkeitsinjektion und hierarchische Injektoren in Angular2 funktionieren:
Sie können feststellen, dass Sie
Observable
im Service auch Eigenschaften definieren können , um Teile Ihrer Anwendung zu benachrichtigen, wenn sich Ihre globalen Eigenschaften ändern:Siehe diese Frage für weitere Details:
quelle
HTTP_PROVIDERS
und ähnlich, sollten sie auch nicht hinzugefügt werdenbootstrap()
?bootstrap()
aber in der Praxis spielt es keine Rolle. Ich denke, dass das Auflisten inboostrap()
den Code verständlicher macht. Eine Komponente hat Anbieter, Direktiven und eine Vorlage. Ich finde das überlastet, ohne dass dort auch globale Anbieter aufgeführt sind. Deshalb bevorzuge ichbootstrap()
.alert(globalVar)
zu einem Fehler.Siehe zum Beispiel Angular 2 - Implementierung von Shared Services
oder individuelle Werte angeben
quelle
bootstrap()
.bootstrap()
und Wurzelkomponente sind zwei verschiedene Dinge. Wenn Sie anrufenbootstrap(AppComponent, [MyService])
, registrieren Sie den Dienst inboostrap()
undAppComponent
ist die Stammkomponente. In den Dokumenten wird irgendwo erwähnt, dass es bevorzugt ist, Anbieter (Dienste) in den Stammkomponenten zu registrieren,providers: ['MyService']
aber ich habe noch kein Argument für oder gegenbootstrap()
oder Stammkomponente gefunden.Erstellen Sie die Globals-Klasse in app / globals.ts :
In Ihrer Komponente:
Hinweis : Sie können den Globals-Dienstanbieter anstelle der Komponente direkt zum Modul hinzufügen, und Sie müssen nicht jeder Komponente in diesem Modul als Anbieter hinzufügen.
quelle
Globals
durch Hinzufügen zu auchproviders: [ ... ]
bedeutet, dass Sie einen Wert innerhalb einer Komponente nicht ändern und dann innerhalb einer zweiten Komponente nach dem aktualisierten Wert fragen können. Jedes Mal, wenn Sie injizierenGlobals
, ist es eine neue Instanz. Wenn Sie dieses Verhalten ändern möchten, fügen Sie es einfach NICHTGlobals
als Anbieter hinzu.@Injectable()
IMHO für Angular2 (v2.2.3) besteht der beste Weg darin, Dienste hinzuzufügen, die die globale Variable enthalten, und sie in Komponenten ohne das
providers
Tag in der@Component
Anmerkung einzufügen. Auf diese Weise können Sie Informationen zwischen Komponenten austauschen.Ein Beispieldienst, der eine globale Variable besitzt:
Eine Beispielkomponente, die den Wert Ihrer globalen Variablen aktualisiert :
Eine Beispielkomponente, die den Wert Ihrer globalen Variablen liest :
quelle
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
in der übergeordneten Moduldatei hinzufügen . Vielen Dank.Ich kenne den besten Weg nicht, aber der einfachste Weg, wenn Sie eine globale Variable innerhalb einer Komponente definieren möchten, besteht darin, eine Variable zu verwenden
window
, um wie folgt zu schreiben:window.GlobalVariable = "what ever!"
Sie müssen es nicht an Bootstrap übergeben oder an andere Stellen importieren, und es ist global für alle JS zugänglich (nicht nur für Angular 2-Komponenten).
quelle
So benutze ich es:
global.ts
um es zu benutzen, importiere es einfach so:
BEARBEITET: "_" wird wie empfohlen vorangestellt.
quelle
Ich denke, der beste Weg ist, ein Objekt mit globalen Variablen in Ihrer gesamten Anwendung zu teilen, indem Sie es exportieren und importieren, wo Sie wollen.
Erstellen Sie zunächst eine neue .ts- Datei, z. B. globals.ts, und deklarieren Sie ein Objekt. Ich habe ihm einen Objekttyp gegeben, aber Sie können auch einen beliebigen Typ oder {} verwenden
Danach importieren Sie es
Und benutze es
quelle
Ich mag die Antwort von @supercobra, aber ich würde das const-Schlüsselwort verwenden, da es in ES6 bereits verfügbar ist:
quelle