No Angular 1.x, você pode definir constantes assim:
angular.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')
Qual seria o equivalente em Angular (com TypeScript)?
Só não quero repetir o URL base da API repetidamente em todos os meus serviços.
typescript
angular
AndreFeijo
fonte
fonte
AppSettings
classe deve ser abstrata eAPI_ENDPOINT
membro deve serreadonly
.A solução para a configuração fornecida pela própria equipe angular pode ser encontrada aqui .
Aqui está todo o código relevante:
1) app.config.ts
2) app.module.ts
3) your.service.ts
Agora você pode injetar a configuração em qualquer lugar sem usar os nomes das strings e com o uso da sua interface para verificações estáticas.
Obviamente, é possível separar a interface e a constante para poder fornecer valores diferentes na produção e desenvolvimento, por exemplo
fonte
environment.ts
eenvironment.prod.ts
poder ter constantes diferentes por ambiente? @IlyaChernomordik começou a mencionar isso no último parágrafo de sua resposta.No Angular2, você tem a seguinte definição de fornecimento , que permite configurar diferentes tipos de dependências:
Comparando com Angular 1
app.service
em Angular1 é equivalente auseClass
em Angular2.app.factory
em Angular1 é equivalente auseFactory
em Angular2.app.constant
eapp.value
foi simplificadouseValue
com menos restrições. ou seja, não háconfig
mais bloqueio.app.provider
- Não há equivalente no Angular 2.Exemplos
Para configurar com o injetor raiz:
Ou configure com o injetor do seu componente:
provide
é mão curta para:Com o injetor, é fácil obter o valor:
fonte
No Angular 4, você pode usar a classe de ambiente para manter todos os seus globais.
Você possui environment.ts e environment.prod.ts por padrão.
Por exemplo
E depois no seu serviço:
fonte
const
dentro de um serviço, você pode ter que "fornecer"-lo em ordem de provedores de seu módulo app:{ provide: 'ConstName', useValue: ConstName }
. Eu estava recebendo um erro de tempo de execução sem isso.Atualizado para Angular 4+
Agora podemos simplesmente usar o arquivo de ambientes que angular fornece o padrão se o seu projeto é gerado via angular-cli.
por exemplo
Na pasta de ambientes, crie os seguintes arquivos
environment.prod.ts
environment.qa.ts
environment.dev.ts
e cada arquivo pode conter alterações de código relacionadas, como:
environment.prod.ts
environment.qa.ts
environment.dev.ts
Caso de uso no aplicativo
Você pode importar ambientes para qualquer arquivo, como serviços
clientUtilServices.ts
import {environment} from '../../environments/environment';
Caso de uso na construção
Abra seu arquivo cli angular
.angular-cli.json
e, dentro,"apps": [{...}]
adicione o seguinte códigoSe você deseja criar para produção, executá-
ng build --env=prod
lo lerá a configuraçãoenvironment.prod.ts
, da mesma maneira que você pode fazê-lo paraqa
oudev
## Resposta mais antiga
Eu tenho feito algo como abaixo, no meu provedor:
Então eu tenho acesso a todos os dados constantes em qualquer lugar
fonte
API_ENDPOINT
valor pode ser sobrescrito a qualquer momento. Sethis.ConstantService.API_ENDPOINT = 'blah blah'
for declarado na classe a qualquer momento após a importação da chamada "constante"constant-service
, o novo valor de API_ENDPOINT seria'blah blah'
. Sua solução mostra apenas como acessar uma variável usando um serviço e não usando uma constante.readonly API_ENDPOINT :String;
ng build --env=prod
Embora a abordagem de ter uma classe AppSettings com uma constante de seqüência de caracteres como o ApiEndpoint funcione, não é ideal, pois não poderíamos trocar esse ApiEndpoint real por outros valores no momento do teste de unidade.
Precisamos ser capazes de injetar esses pontos de extremidade da API em nossos serviços (pense em injetar um serviço em outro serviço). Também não precisamos criar uma classe inteira para isso, tudo o que queremos fazer é injetar uma string em nossos serviços, sendo nosso ApiEndpoint. Para concluir a excelente resposta de pixelbits , aqui está o código completo de como isso pode ser feito no Angular 2:
Primeiro, precisamos dizer à Angular como fornecer uma instância do nosso ApiEndpoint quando a solicitarmos em nosso aplicativo (pense nisso como registrando uma dependência):
E então, no serviço, injetamos esse ApiEndpoint no construtor de serviços e a Angular o fornecerá com base em nosso registro acima:
fonte
Esta é minha experiência recente com este cenário:
Segui os documentos oficiais e atualizados aqui:
https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens
Parece que o OpaqueToken agora está obsoleto e devemos usar o InjectionToken ; portanto, esses são meus arquivos executados como um encanto:
app-config.interface.ts
app-config.constants.ts
app.module.ts
my-service.service.ts
O resultado é limpo e não há avisos no console, graças ao recente comentário de John Papa nesta edição:
https://github.com/angular/angular-cli/issues/2034
A chave foi implementada em um arquivo diferente da interface.
fonte
Todas as soluções parecem ser complicadas. Estou procurando a solução mais simples para este caso e só quero usar constantes. As constantes são simples. Existe algo que fale contra a seguinte solução?
app.const.ts
app.service.ts
fonte
Basta usar uma constante Typescript
Você pode usá-lo no injetor de dependência usando
fonte
const
yestSe você estiver usando o Webpack , que eu recomendo, você pode configurar constantes para diferentes ambientes. Isso é especialmente valioso quando você tem diferentes valores constantes em uma base por ambiente.
Você provavelmente terá vários arquivos webpack em seu
/config
diretório (por exemplo, webpack.dev.js, webpack.prod.js, etc.). Então você terá um,custom-typings.d.ts
você os adicionará lá. Aqui está o padrão geral a seguir em cada arquivo e um exemplo de uso em um Componente.webpack. {env} .js
custom-typings.d.ts
Componente
fonte
O uso de um arquivo de propriedades gerado durante uma construção é simples e fácil. Essa é a abordagem que a CLI Angular usa. Defina um arquivo de propriedades para cada ambiente e use um comando durante a compilação para determinar qual arquivo será copiado para seu aplicativo. Em seguida, basta importar o arquivo de propriedades a ser usado.
https://github.com/angular/angular-cli#build-targets-and-environment-files
fonte
Uma abordagem para o Angular4 seria definir uma constante no nível do módulo:
Então, em seu serviço:
fonte
Eu tenho outra maneira de definir constantes globais. Porque se definimos no arquivo ts, se construímos no modo de produção, não é fácil encontrar constantes para alterar o valor.
Na pasta do aplicativo, adiciono a pasta configs / setting.json
Conteúdo em setting.json
No módulo de aplicativo, adicione APP_INITIALIZER
Dessa forma, eu posso alterar o valor no arquivo json mais facilmente. Eu também uso esse caminho para mensagens constantes de erro / aviso.
fonte
O AngularJS
module.constant
não define uma constante no sentido padrão.Embora ele próprio seja um mecanismo de registro de provedor, ele é melhor compreendido no contexto da função related
module.value
($provide.value
). A documentação oficial indica claramente o caso de uso:Compare isso com a documentação de
module.constant
($provide.constant
), que também indica claramente o caso de uso (ênfase meu):Portanto, a
constant
função AngularJS não fornece uma constante no significado comumente entendido do termo no campo.Dito isto, as restrições impostas ao objeto fornecido, juntamente com sua disponibilidade anterior via injetor $, sugerem claramente que o nome é usado por analogia.
Se você quisesse uma constante real em um aplicativo AngularJS, "forneceria" uma da mesma maneira que faria em qualquer programa JavaScript que seja
No Angular 2, a mesma técnica é aplicável.
Os aplicativos Angular 2 não possuem uma fase de configuração no mesmo sentido que os aplicativos AngularJS. Além disso, não há mecanismo de decorador de serviço ( AngularJS Decorator ), mas isso não é particularmente surpreendente, considerando a diferença entre eles.
O exemplo de
é vagamente arbitrário e um pouco desanimador, porque
$provide.constant
está sendo usado para especificar um objeto que, aliás, também é uma constante. Você também pode ter escritopois todos podem mudar.
Agora, o argumento da testabilidade, zombando da constante, diminui porque literalmente não muda.
Não se zomba de π.
É claro que a semântica específica de seu aplicativo pode ser que seu terminal possa mudar ou sua API possa ter um mecanismo de failover não transparente, portanto, seria razoável que o terminal da API fosse alterado sob determinadas circunstâncias.
Mas, nesse caso, fornecê-lo como uma representação literal de cadeia de caracteres de um único URL para a
constant
função não teria funcionado.Um argumento melhor e provavelmente mais um alinhado com a razão da existência da
$provide.constant
função AngularJS é que, quando o AngularJS foi introduzido, o JavaScript não tinha um conceito de módulo padrão . Nesse caso, os globais seriam usados para compartilhar valores, mutáveis ou imutáveis, e o uso de globais é problemático.Dito isto, fornecer algo assim através de uma estrutura aumenta o acoplamento a essa estrutura. Também combina lógica específica angular com lógica que funcionaria em qualquer outro sistema.
Isso não quer dizer que seja uma abordagem errada ou prejudicial, mas pessoalmente, se eu quiser uma constante em um aplicativo Angular 2, escreverei
exatamente como eu teria usado o AngularJS.
Quanto mais as coisas mudam ...
fonte
A melhor maneira de criar constantes amplas para aplicativos no Angular 2 é usando os arquivos environment.ts. A vantagem de declarar essas constantes é que você pode variar de acordo com o ambiente, pois pode haver um arquivo de ambiente diferente para cada ambiente.
fonte
Você pode criar uma classe para sua variável global e exportar essa classe da seguinte maneira:
Depois de criar e exportar sua
CONSTANT
classe, você deve importar essa classe na classe em que deseja usar, assim:Você pode usar isso em
constructor
oungOnInit(){}
ou em qualquer método predefinido.fonte