In Angular 1.x können Sie Konstanten wie folgt definieren:
angular.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')
Was wäre das Äquivalent in Angular (mit TypeScript)?
Ich möchte die API-Basis-URL in all meinen Diensten einfach nicht immer wieder wiederholen.
typescript
angular
AndreFeijo
quelle
quelle
AppSettings
Klasse sollte abstrakt sein und dasAPI_ENDPOINT
Mitglied sollte es seinreadonly
.Die Lösung für die vom Winkelteam selbst bereitgestellte Konfiguration finden Sie hier .
Hier ist der gesamte relevante Code:
1) app.config.ts
2) app.module.ts
3) your.service.ts
Jetzt können Sie die Konfiguration überall einfügen, ohne die Zeichenfolgennamen zu verwenden und Ihre Schnittstelle für statische Überprüfungen zu verwenden.
Sie können natürlich die Schnittstelle und die Konstante weiter trennen, um unterschiedliche Werte in Produktion und Entwicklung liefern zu können, z
quelle
environment.ts
undenvironment.prod.ts
so , dass Sie verschiedene Konstanten pro Umwelt haben können? @IlyaChernomordik begann dies im letzten Absatz seiner Antwort zu erwähnen.In Angular2 haben Sie Folgendes zur Verfügung gestellt Definition, die Ihnen verschiedene Arten von Abhängigkeiten Setup erlaubt:
Im Vergleich zu Winkel 1
app.service
in Angular1 entsprichtuseClass
in Angular2.app.factory
in Angular1 entsprichtuseFactory
in Angular2.app.constant
undapp.value
wurdeuseValue
mit weniger Einschränkungen vereinfacht . dh es gibt keinenconfig
Block mehr.app.provider
- In Winkel 2 gibt es kein Äquivalent.Beispiele
So richten Sie mit dem Root-Injektor ein:
Oder richten Sie mit dem Injektor Ihrer Komponente ein:
provide
ist eine Abkürzung für:Mit dem Injektor ist es einfach, den Wert zu ermitteln:
quelle
In Angular 4 können Sie die Umgebungsklasse verwenden, um alle Ihre globalen Werte beizubehalten.
Sie haben standardmäßig environment.ts und environment.prod.ts.
Beispielsweise
Und dann zu Ihren Diensten:
quelle
const
Inneres eines Dienstes zuzugreifen , müssen Sie es möglicherweise im Provider-Array Ihres App-Moduls "bereitstellen" :{ provide: 'ConstName', useValue: ConstName }
. Ich habe ohne dies einen Laufzeitfehler erhalten.Aktualisiert für Angular 4+
Jetzt können wir einfach Umgebungsdateien verwenden, deren Winkel Standard sind, wenn Ihr Projekt über Angular-CLI generiert wird.
beispielsweise
Erstellen Sie in Ihrem Umgebungsordner folgende Dateien
environment.prod.ts
environment.qa.ts
environment.dev.ts
und jede Datei kann verwandte Codeänderungen enthalten, wie zum Beispiel:
environment.prod.ts
environment.qa.ts
environment.dev.ts
Anwendungsfall in der Anwendung
Sie können Umgebungen in beliebige Dateien wie z. B. Dienste importieren
clientUtilServices.ts
import {environment} from '../../environments/environment';
Anwendungsfall im Build
Öffnen Sie Ihre eckige CLI-Datei
.angular-cli.json
und"apps": [{...}]
fügen Sie den folgenden Code hinzuWenn Sie für die Produktion erstellen möchten, führen
ng build --env=prod
Sie die Konfiguration ausenvironment.prod.ts
, genauso wie Sie dies fürqa
oder tun könnendev
## Ältere Antwort
Ich habe in meinem Provider Folgendes getan:
Dann habe ich überall Zugriff auf alle konstanten Daten
quelle
API_ENDPOINT
Wert jederzeit überschrieben werden. Wennthis.ConstantService.API_ENDPOINT = 'blah blah'
in der Klasse jederzeit deklariert wird, nachdem Ihre sogenannte "Konstante" aus dem importiert wurde, lautetconstant-service
der neue Wert von API_ENDPOINT'blah blah'
. Ihre Lösung zeigt nur, wie Sie mit einem Dienst auf eine Variable zugreifen und nicht mit einer Konstanten.readonly API_ENDPOINT :String;
ng build --env=prod
Der Ansatz, eine AppSettings-Klasse mit einer Zeichenfolgenkonstante wie ApiEndpoint zu haben, funktioniert zwar, ist jedoch nicht ideal, da wir diesen realen ApiEndpoint zum Zeitpunkt des Komponententests nicht gegen einige andere Werte austauschen können.
Wir müssen in der Lage sein, diese API-Endpunkte in unsere Dienste einzufügen (denken Sie daran, einen Dienst in einen anderen Dienst einzufügen). Wir müssen dafür auch keine ganze Klasse erstellen. Wir möchten lediglich einen String in unsere Dienste einfügen, der unser ApiEndpoint ist. Um die hervorragende Antwort durch Pixelbits zu vervollständigen , finden Sie hier den vollständigen Code, wie dies in Angular 2 durchgeführt werden kann:
Zunächst müssen wir Eckige sagen , wie zu schaffen , eine Instanz unserer ApiEndpoint , wenn wir es in unserer App fragen (man denke an sie als eine Abhängigkeit Registrierung):
Und dann injizieren wir diesen ApiEndpoint im Service in den Servicekonstruktor und Angular stellt ihn uns basierend auf unserer obigen Registrierung zur Verfügung:
quelle
Dies ist meine jüngste Erfahrung mit diesem Szenario:
Ich habe die offiziellen und aktualisierten Dokumente hier verfolgt:
https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens
Es scheint, dass OpaqueToken jetzt veraltet ist und wir InjectionToken verwenden müssen. Dies sind also meine Dateien, die wie ein Zauber laufen:
app-config.interface.ts
app-config.constants.ts
app.module.ts
my-service.service.ts
Das Ergebnis ist sauber und es gibt keine Warnungen auf der Konsole. Dank des jüngsten Kommentars von John Papa in dieser Ausgabe:
https://github.com/angular/angular-cli/issues/2034
Der Schlüssel wurde in einer anderen Datei der Schnittstelle implementiert.
quelle
Alle Lösungen scheinen kompliziert zu sein. Ich suche nach der einfachsten Lösung für diesen Fall und möchte nur Konstanten verwenden. Konstanten sind einfach. Gibt es etwas, das gegen die folgende Lösung spricht?
app.const.ts
app.service.ts
quelle
Verwenden Sie einfach eine Typescript-Konstante
Sie können es im Abhängigkeitsinjektor mit verwenden
quelle
const
yest verwendenWenn Sie Webpack verwenden , das ich empfehle, können Sie Konstanten für verschiedene Umgebungen einrichten. Dies ist besonders nützlich, wenn Sie je nach Umgebung unterschiedliche konstante Werte haben.
Sie haben wahrscheinlich mehrere Webpack-Dateien in Ihrem
/config
Verzeichnis (z. B. webpack.dev.js, webpack.prod.js usw.). Dann haben Sie eine, diecustom-typings.d.ts
Sie dort hinzufügen. Hier ist das allgemeine Muster, das in jeder Datei zu befolgen ist, und eine Beispielverwendung in einer Komponente.Webpack. {env} .js
custom-typings.d.ts
Komponente
quelle
Die Verwendung einer Eigenschaftendatei, die während eines Builds generiert wird, ist einfach und unkompliziert. Dies ist der Ansatz, den die Angular CLI verwendet. Definieren Sie eine Eigenschaftendatei für jede Umgebung und verwenden Sie während der Erstellung einen Befehl, um zu bestimmen, welche Datei in Ihre App kopiert wird. Importieren Sie dann einfach die zu verwendende Eigenschaftendatei.
https://github.com/angular/angular-cli#build-targets-and-environment-files
quelle
Ein Ansatz für Angular4 wäre die Definition einer Konstante auf Modulebene:
Dann in Ihrem Dienst:
quelle
Ich habe eine andere Möglichkeit, globale Konstanten zu definieren. Denn wenn wir in der ts-Datei definiert haben, ist es im Build-Modus nicht einfach, Konstanten zu finden, um den Wert zu ändern.
Im App-Ordner füge ich den Ordner configs / settings.json hinzu
Inhalt in settings.json
Fügen Sie im App-Modul APP_INITIALIZER hinzu
Auf diese Weise kann ich den Wert in der JSON-Datei einfacher ändern. Ich benutze diesen Weg auch für ständige Fehler- / Warnmeldungen.
quelle
AngularJS
module.constant
definiert keine Konstante im Standard-Sinne.Während es als Anbieterregistrierungsmechanismus für sich steht, wird es am besten im Kontext der verwandten
module.value
($provide.value
) Funktion verstanden. In der offiziellen Dokumentation ist der Anwendungsfall klar angegeben:Vergleichen Sie dies mit der Dokumentation für
module.constant
($provide.constant
), in der auch der Anwendungsfall klar angegeben ist (Hervorhebung von mir):Daher
constant
liefert die AngularJS- Funktion keine Konstante im allgemein verständlichen Sinne des Begriffs auf dem Gebiet.Die Einschränkungen für das bereitgestellte Objekt sowie seine frühere Verfügbarkeit über den $ -Injektor lassen jedoch eindeutig darauf schließen, dass der Name analog verwendet wird.
Wenn Sie eine tatsächliche Konstante in einer AngularJS-Anwendung wünschen, würden Sie eine wie in jedem JavaScript-Programm "bereitstellen"
In Winkel 2 ist dieselbe Technik anwendbar.
Angular 2-Anwendungen haben keine Konfigurationsphase im gleichen Sinne wie AngularJS-Anwendungen. Darüber hinaus gibt es keinen Service-Dekorationsmechanismus ( AngularJS Decorator ), was jedoch nicht besonders überraschend ist, da sie sich voneinander unterscheiden.
Das Beispiel von
ist vage willkürlich und leicht abstoßend, weil
$provide.constant
damit ein Objekt angegeben wird, das übrigens auch eine Konstante ist. Du hättest genauso gut schreiben könnenfür alle kann sich beides ändern.
Jetzt wird das Argument für Testbarkeit, das die Konstante verspottet, verringert, weil es sich buchstäblich nicht ändert.
Man verspottet π nicht.
Natürlich könnte Ihre anwendungsspezifische Semantik darin bestehen, dass sich Ihr Endpunkt ändern könnte oder Ihre API über einen nicht transparenten Failover-Mechanismus verfügt, sodass es unter bestimmten Umständen sinnvoll wäre, den API-Endpunkt zu ändern.
In diesem Fall
constant
hätte es jedoch nicht funktioniert , es als String-Literal-Darstellung einer einzelnen URL für die Funktion bereitzustellen.Ein besseres Argument, das wahrscheinlich mit dem Grund für die Existenz der AngularJS-
$provide.constant
Funktion übereinstimmt , ist, dass JavaScript bei der Einführung von AngularJS kein Standardmodulkonzept hatte . In diesem Fall würden Globals verwendet, um veränderbare oder unveränderliche Werte zu teilen, und die Verwendung von Globals ist problematisch.Das heißt, wenn so etwas durch ein Framework bereitgestellt wird, erhöht sich die Kopplung an dieses Framework. Es mischt auch winkelspezifische Logik mit Logik, die in jedem anderen System funktionieren würde.
Dies bedeutet nicht, dass es sich um einen falschen oder schädlichen Ansatz handelt, aber wenn ich persönlich eine Konstante in einer Angular 2-Anwendung möchte , schreibe ich
Genau wie ich es getan hätte, wenn ich AngularJS verwendet hätte.
Je mehr Dinge sich ändern ...
quelle
Der beste Weg, um anwendungsweite Konstanten in Angular 2 zu erstellen, ist die Verwendung von environment.ts-Dateien. Der Vorteil der Deklaration solcher Konstanten besteht darin, dass Sie sie je nach Umgebung variieren können, da für jede Umgebung eine andere Umgebungsdatei vorhanden sein kann.
quelle
Sie können eine Klasse für Ihre globale Variable erstellen und diese Klasse dann wie folgt exportieren:
Nach dem Erstellen und Exportieren Ihrer
CONSTANT
Klasse sollten Sie diese Klasse wie folgt in die Klasse importieren, in der Sie sie verwenden möchten:Sie können dies entweder in
constructor
oderngOnInit(){}
oder in beliebigen vordefinierten Methoden verwenden.quelle