AngularJS module.constant
не определяет константу в стандартном смысле.
Хотя он сам по себе является механизмом регистрации провайдера, его лучше понять в контексте функции related module.value
( $provide.value
). Официальная документация четко описывает вариант использования:
Зарегистрируйте службу значений с помощью инжектора $, такого как строка, число, массив, объект или функция. Это сокращение для регистрации службы, где свойство $ get ее провайдера является фабричной функцией, которая не принимает аргументов и возвращает службу значения. Это также означает, что невозможно внедрить другие сервисы в сервис с высокой стоимостью.
Сравните это с документацией для module.constant
( $provide.constant
), в которой также четко указан вариант использования (выделено мое):
Зарегистрируйте постоянную службу с помощью $ injector, например строки, числа, массива, объекта или функции. Как и значение, невозможно вставить другие сервисы в константу. Но в отличие от значения, константа может быть введена в функцию конфигурации модуля (см. Angular.Module) и не может быть переопределена декоратором AngularJS .
Следовательно, constant
функция AngularJS не обеспечивает константу в общепринятом значении термина в поле.
Тем не менее, ограничения, наложенные на предоставленный объект, вместе с его более ранней доступностью через $ injector, ясно указывают на то, что имя используется по аналогии.
Если вам нужна фактическая константа в приложении AngularJS, вы бы «предоставили» ее так же, как в любой программе JavaScript, которая
export const π = 3.14159265;
В Angular 2 применяется та же техника.
Приложения Angular 2 не имеют фазы конфигурации в том же смысле, что и приложения AngularJS. Кроме того, не существует механизма декоратора сервисов ( AngularJS Decorator ), но это не особенно удивительно, учитывая, насколько они отличаются друг от друга.
Пример
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
неоптимально произвольные и слегка отталкивающий , потому что $provide.constant
используются , чтобы указать объект , который , кстати , также постоянный. Вы могли бы также написать
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
для всех может измениться.
Теперь аргумент в пользу тестируемости, насмешливый над константой, уменьшается, потому что он буквально не меняется.
Нельзя издеваться над π.
Конечно, семантика вашего приложения может состоять в том, что ваша конечная точка может измениться, или ваш API может иметь непрозрачный механизм отработки отказа, поэтому было бы разумно, чтобы конечная точка API изменялась при определенных обстоятельствах.
Но в этом случае предоставление его в виде строкового литерала для представления одного URL-адреса constant
функции не сработало бы.
Лучший аргумент, и, вероятно, еще один, связанный с причиной существования $provide.constant
функции AngularJS, заключается в том, что, когда был введен AngularJS, в JavaScript не было стандартной концепции модуля. В этом случае глобальные переменные будут использоваться для обмена значениями, изменяемыми или неизменяемыми, и использование глобальных переменных проблематично.
Тем не менее, предоставление чего-то подобного через структуру увеличивает связь с этой структурой. Он также смешивает специфическую для Angular логику с логикой, которая будет работать в любой другой системе.
Это не значит, что это неправильный или вредный подход, но лично я, если мне нужна константа в приложении Angular 2, я напишу
export const π = 3.14159265;
так же, как я бы использовал AngularJS.
Чем больше вещи меняются ...
AppSettings
класс должен быть абстрактным иAPI_ENDPOINT
член должен бытьreadonly
.