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:
Registrieren Sie einen Wertedienst beim $ -Injektor, z. B. eine Zeichenfolge, eine Zahl, ein Array, ein Objekt oder eine Funktion. Dies ist die Abkürzung für die Registrierung eines Dienstes, bei dem die Eigenschaft $ get seines Anbieters eine Factory-Funktion ist, die keine Argumente akzeptiert und den Wertedienst zurückgibt. Dies bedeutet auch, dass es nicht möglich ist, andere Dienste in einen Wertedienst einzufügen.
Vergleichen Sie dies mit der Dokumentation für module.constant
( $provide.constant
), in der auch der Anwendungsfall klar angegeben ist (Hervorhebung von mir):
Registrieren Sie einen konstanten Dienst beim $ -Injektor, z. B. eine Zeichenfolge, eine Zahl, ein Array, ein Objekt oder eine Funktion. Wie der Wert ist es nicht möglich, andere Dienste in eine Konstante einzufügen. Im Gegensatz zum Wert kann eine Konstante in eine Modulkonfigurationsfunktion eingefügt werden (siehe angle.Module) und von einem AngularJS-Dekorator nicht überschrieben werden .
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"
export const π = 3.14159265;
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
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
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önnen
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
fü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
export const π = 3.14159265;
Genau wie ich es getan hätte, wenn ich AngularJS verwendet hätte.
Je mehr Dinge sich ändern ...
AppSettings
Klasse sollte abstrakt sein und dasAPI_ENDPOINT
Mitglied sollte es seinreadonly
.