AngularJS's module.constant
nie definiuje stałej w sensie standardowym.
Chociaż działa jako mechanizm rejestracji dostawcy, najlepiej jest go rozumieć w kontekście funkcji powiązanej module.value
( $provide.value
). Oficjalna dokumentacja wyraźnie określa przypadek użycia:
Zarejestruj usługę wartości za pomocą $ injector, taką jak ciąg, liczba, tablica, obiekt lub funkcja. Jest to skrót od rejestracji usługi, w której właściwość $ get jego dostawcy jest funkcją fabryczną, która nie przyjmuje argumentów i zwraca usługę wartości. Oznacza to również, że nie można wstrzykiwać innych usług do usługi o wartości.
Porównaj to z dokumentacją dla module.constant
( $provide.constant
), która również wyraźnie określa przypadek użycia (moje wyróżnienie):
Zarejestruj stałą usługę za pomocą $ injector, taką jak ciąg, liczba, tablica, obiekt lub funkcja. Podobnie jak wartość, nie jest możliwe wstrzyknięcie innych usług do stałej. Ale w przeciwieństwie do wartości, stała może zostać wstrzyknięta do funkcji konfiguracji modułu (patrz angular.Module) i nie może zostać zastąpiona przez dekorator AngularJS .
Dlatego AngularJS constant
funkcja nie zapewnia stałej w powszechnie rozumianym znaczeniu tego terminu w tej dziedzinie.
To powiedziawszy, ograniczenia nałożone na udostępniony obiekt, wraz z jego wcześniejszą dostępnością przez $ injector, wyraźnie sugerują, że nazwa jest używana przez analogię.
Jeśli chcesz rzeczywistą stałą w aplikacji AngularJS, „dostarczysz” ją w taki sam sposób, jak w każdym programie JavaScript, który jest
export const π = 3.14159265;
W Angular 2 obowiązuje ta sama technika.
Aplikacje Angular 2 nie mają fazy konfiguracji w tym samym sensie, co aplikacje AngularJS. Ponadto nie ma mechanizmu dekoratora usług ( AngularJS Decorator ), ale nie jest to szczególnie zaskakujące, biorąc pod uwagę, jak różnią się one od siebie.
Przykład
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
jest niejasno arbitralne i nieco odrażające, ponieważ $provide.constant
jest używane do określenia obiektu, który nawiasem mówiąc, jest również stały. Równie dobrze mógłbyś napisać
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
wszyscy mogą się zmienić.
Teraz argument za testowalnością, kpiącą ze stałej, jest mniejszy, ponieważ dosłownie się nie zmienia.
Nie kpi się z π.
Oczywiście semantyka specyficzna dla aplikacji może polegać na tym, że punkt końcowy może ulec zmianie lub interfejs API może mieć nieprzejrzysty mechanizm przełączania awaryjnego, więc rozsądne byłoby, aby punkt końcowy interfejsu API zmienił się w pewnych okolicznościach.
Ale w takim przypadku podanie jej jako dosłownego ciągu pojedynczego adresu URL constant
funkcji nie działałoby.
Lepszym argumentem i prawdopodobnie jednym bardziej zgodnym z przyczyną istnienia $provide.constant
funkcji AngularJS jest to, że kiedy wprowadzono AngularJS, JavaScript nie miał standardu koncepcji modułu. W takim przypadku globale byłyby używane do dzielenia wartości, zmiennych lub niezmiennych, a używanie globałów jest problematyczne.
To powiedziawszy, dostarczenie czegoś takiego poprzez framework zwiększa sprzężenie z tym frameworkem. Łączy również logikę kątową z logiką, która działałaby w każdym innym systemie.
Nie oznacza to, że jest to złe lub szkodliwe podejście, ale osobiście, jeśli chcę stałą w aplikacji Angular 2, napiszę
export const π = 3.14159265;
tak jak bym zrobił, gdybym używał AngularJS.
Im więcej rzeczy się zmieni ...
AppSettings
klasa powinna być abstrakcyjna, aAPI_ENDPOINT
członek powinienreadonly
.