В Angular 1.x вы можете определить константы следующим образом:
angular.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')
Что было бы эквивалентно в Angular (с TypeScript)?
Я просто не хочу повторять базовый URL API снова и снова во всех моих сервисах.
typescript
angular
AndreFeijo
источник
источник
AppSettings
класс должен быть абстрактным иAPI_ENDPOINT
член должен бытьreadonly
.Решение для конфигурации, предоставленной самой угловой командой, можно найти здесь .
Вот весь соответствующий код:
1) app.config.ts
2) app.module.ts
3) your.service.ts
Теперь вы можете внедрять конфигурацию везде, не используя имена строк и используя ваш интерфейс для статических проверок.
Конечно, вы можете отделить Интерфейс и константу дальше, чтобы иметь возможность предоставлять различные значения в производстве и разработке, например
источник
environment.ts
иenvironment.prod.ts
получить разные константы для каждой среды? @IlyaChernomordik начал упоминать об этом в последнем абзаце своего ответа.В Angular2 у вас есть следующее определение определения, которое позволяет вам устанавливать различные виды зависимостей:
По сравнению с угловой 1
app.service
в Angular1 эквивалентноuseClass
в Angular2.app.factory
в Angular1 эквивалентноuseFactory
в Angular2.app.constant
иapp.value
был упрощенuseValue
с меньшими ограничениями. то есть больше нетconfig
блока.app.provider
- В Angular 2 нет эквивалента.Примеры
Для настройки с корневым инжектором:
Или настройте с помощью инжектора вашего компонента:
provide
короткая рука для:С помощью инжектора получить значение легко:
источник
В Angular 4 вы можете использовать класс среды, чтобы сохранить все ваши глобальные переменные.
У вас есть environment.ts и environment.prod.ts по умолчанию.
Например
И тогда к вашим услугам:
источник
const
внутренней части сервиса, возможно , придется «обеспечить» его в массиве поставщиков своего приложения модуля:{ provide: 'ConstName', useValue: ConstName }
. Я получил ошибку во время выполнения без этого.Обновлено для Angular 4+
Теперь мы можем просто использовать файл сред, который angular предоставляет по умолчанию, если ваш проект генерируется с помощью angular-cli.
например
В вашей среде папок создайте следующие файлы
environment.prod.ts
environment.qa.ts
environment.dev.ts
и каждый файл может содержать связанные изменения кода, такие как:
environment.prod.ts
environment.qa.ts
environment.dev.ts
Вариант использования в приложении
Вы можете импортировать среды в любой файл, например, сервисы
clientUtilServices.ts
import {environment} from '../../environments/environment';
Вариант использования в сборке
Откройте свой угловой файл cli
.angular-cli.json
и внутри"apps": [{...}]
добавьте следующий кодЕсли вы хотите собрать для производства, запустите
ng build --env=prod
его будет читать конфигурациюenvironment.prod.ts
, так же, как вы можете сделать это дляqa
илиdev
## Старый ответ
Я делал что-то вроде ниже, в моем провайдере:
Тогда у меня есть доступ ко всем постоянным данным в любом месте
источник
API_ENDPOINT
значение может быть переписано в любой момент времени. Еслиthis.ConstantService.API_ENDPOINT = 'blah blah'
объявлено в классе в любое время после того, как ваша так называемая «константа» импортирована изconstant-service
, новое значение API_ENDPOINT будет'blah blah'
. Ваше решение просто показывает, как получить доступ к переменной с помощью службы, а не с помощью константы.readonly API_ENDPOINT :String;
ng build --env=prod
Хотя подход с использованием класса AppSettings со строковой константой в качестве ApiEndpoint работает, он не идеален, поскольку мы не сможем поменять эту реальную точку ApiEndpoint на некоторые другие значения во время модульного тестирования.
Мы должны иметь возможность внедрять эти конечные точки API в наши сервисы (подумайте о внедрении сервиса в другой сервис). Нам также не нужно создавать целый класс для этого, все, что мы хотим сделать - это вставить строку в наши сервисы, являющуюся нашей ApiEndpoint. Чтобы завершить отличный ответ по пиксельным битам , вот полный код того, как это можно сделать в Angular 2:
Сначала мы должны сказать Angular, как предоставить экземпляр нашего ApiEndpoint, когда мы запрашиваем его в нашем приложении (представьте, что это регистрация зависимости):
А затем в службе мы впрыскивать этот ApiEndpoint в конструктор службы и Угловое обеспечит это для нас на основе нашей регистрации выше:
источник
Это мой недавний опыт с этим сценарием:
Я следил за официальными и обновленными документами здесь:
https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens
Похоже, OpaqueToken устарела, и мы должны использовать InjectionToken , так что мои файлы работают как чудо:
app-config.interface.ts
app-config.constants.ts
app.module.ts
my-service.service.ts
Результат чистый, и на консоли нет предупреждений благодаря недавнему комментарию Джона Папы в этом выпуске:
https://github.com/angular/angular-cli/issues/2034
Ключ реализован в другом файле интерфейса.
источник
Все решения кажутся сложными. Я ищу простейшее решение для этого случая, и я просто хочу использовать константы. Константы просты. Есть что-нибудь, что говорит против следующего решения?
app.const.ts
app.service.ts
источник
Просто используйте константу Typescript
Вы можете использовать его в инжекторе зависимостей, используя
источник
const
YestЕсли вы используете Webpack , который я рекомендую, вы можете настроить константы для разных сред. Это особенно ценно, когда у вас разные постоянные значения для каждой среды.
Скорее всего, в вашем
/config
каталоге будет несколько файлов webpack (например, webpack.dev.js, webpack.prod.js и т. Д.). Тогда у вас будет,custom-typings.d.ts
вы добавите их туда. Вот общая схема, которой необходимо следовать в каждом файле, и пример использования в Компоненте.WebPack. {} Env .js
таможенно-typings.d.ts
Составная часть
источник
Использовать файл свойств, сгенерированный во время сборки, просто и легко. Это подход, который использует Angular CLI. Определите файл свойств для каждой среды и используйте команду во время сборки, чтобы определить, какой файл копируется в ваше приложение. Затем просто импортируйте файл свойств для использования.
https://github.com/angular/angular-cli#build-targets-and-environment-files
источник
Одним из подходов для Angular4 было бы определение константы на уровне модуля:
Тогда к вашим услугам:
источник
У меня есть другой способ определения глобальных констант. Потому что, если мы определили в файле ts, если построить в производственном режиме, не легко найти константы для изменения значения.
В папке приложения я добавляю папку config / setting.json
Содержимое в setting.json
В модуле приложения добавьте APP_INITIALIZER
таким образом, я могу изменить значение в файле JSON проще. Я также использую этот способ для постоянных сообщений об ошибках / предупреждений.
источник
AngularJS
module.constant
не определяет константу в стандартном смысле.Хотя он сам по себе является механизмом регистрации провайдера, его лучше понять в контексте функции related
module.value
($provide.value
). Официальная документация четко описывает вариант использования:Сравните это с документацией для
module.constant
($provide.constant
), в которой также четко указан вариант использования (выделено мое):Следовательно,
constant
функция AngularJS не обеспечивает константу в общепринятом значении термина в поле.Тем не менее, ограничения, наложенные на предоставленный объект, вместе с его более ранней доступностью через $ injector, ясно указывают на то, что имя используется по аналогии.
Если вам нужна фактическая константа в приложении AngularJS, вы бы «предоставили» ее так же, как в любой программе JavaScript, которая
В Angular 2 применяется та же техника.
Приложения Angular 2 не имеют фазы конфигурации в том же смысле, что и приложения AngularJS. Кроме того, не существует механизма декоратора сервисов ( AngularJS Decorator ), но это не особенно удивительно, учитывая, насколько они отличаются друг от друга.
Пример
неоптимально произвольные и слегка отталкивающий , потому что
$provide.constant
используются , чтобы указать объект , который , кстати , также постоянный. Вы могли бы также написатьдля всех может измениться.
Теперь аргумент в пользу тестируемости, насмешливый над константой, уменьшается, потому что он буквально не меняется.
Нельзя издеваться над π.
Конечно, семантика вашего приложения может состоять в том, что ваша конечная точка может измениться, или ваш API может иметь непрозрачный механизм отработки отказа, поэтому было бы разумно, чтобы конечная точка API изменялась при определенных обстоятельствах.
Но в этом случае предоставление его в виде строкового литерала для представления одного URL-адреса
constant
функции не сработало бы.Лучший аргумент, и, вероятно, еще один, связанный с причиной существования
$provide.constant
функции AngularJS, заключается в том, что, когда был введен AngularJS, в JavaScript не было стандартной концепции модуля. В этом случае глобальные переменные будут использоваться для обмена значениями, изменяемыми или неизменяемыми, и использование глобальных переменных проблематично.Тем не менее, предоставление чего-то подобного через структуру увеличивает связь с этой структурой. Он также смешивает специфическую для Angular логику с логикой, которая будет работать в любой другой системе.
Это не значит, что это неправильный или вредный подход, но лично я, если мне нужна константа в приложении Angular 2, я напишу
так же, как я бы использовал AngularJS.
Чем больше вещи меняются ...
источник
Лучший способ создания констант всего приложения в Angular 2 - использование файлов environment.ts. Преимущество объявления таких констант состоит в том, что вы можете изменять их в зависимости от среды, поскольку для каждой среды может быть свой файл среды.
источник
Вы можете создать класс для вашей глобальной переменной и затем экспортировать этот класс следующим образом:
После создания и экспорта вашего
CONSTANT
класса вы должны импортировать этот класс в тот класс, где вы хотите использовать, например:Вы можете использовать это либо в
constructor
илиngOnInit(){}
, или в каких - либо методов предопределить.источник