Eu gostaria que algumas variáveis estivessem acessíveis em qualquer Angular 2
lugar do Typescript
idioma. Como devo fazer isso?
typescript
angular
supercobra
fonte
fonte
Uncaught ReferenceError: Settings is not defined
. A classeSettings
com variáveis estáticas públicas está configurada para exportar e importada para onde é usada.Respostas:
Aqui está a solução mais simples w o /
Service
nemObserver
:Coloque as variáveis globais em um arquivo e exporte-as.
Para usar globais em outro arquivo, use uma
import
instrução:import * as myGlobals from 'globals';
Exemplo:
Obrigado @ eric-martinez
fonte
import * as globs from 'globals'
export const
vez deexport var
- você realmente quer ter certeza de que essas variáveis globais não podem ser alteradasimport * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
Também gosto da solução da @supercobra. Eu só gostaria de melhorar um pouco. Se você exportar um objeto que contenha todas as constantes, poderá simplesmente usar o es6 import o módulo sem usar o require .
Também usei o Object.freeze para tornar as propriedades verdadeiras constantes. Se você está interessado no tópico, pode ler esta postagem .
Consulte o módulo usando a importação.
fonte
Um serviço compartilhado é a melhor abordagem
Mas você precisa ter muito cuidado ao registrá-lo para poder compartilhar uma única instância para todo o aplicativo. Você precisa defini-lo ao registrar seu aplicativo:
mas não para defini-lo novamente dentro dos
providers
atributos de seus componentes:Caso contrário, uma nova instância do seu serviço será criada para o componente e seus subcomponentes.
Você pode dar uma olhada nesta pergunta sobre como a injeção de dependência e os injetores hierárquicos funcionam no Angular2:
Você pode perceber que também pode definir
Observable
propriedades no serviço para notificar partes do seu aplicativo quando suas propriedades globais forem alteradas:Veja esta pergunta para mais detalhes:
fonte
HTTP_PROVIDERS
e semelhante, eles também não devem ser adicionadosbootstrap()
?bootstrap()
mas na prática isso não importa. Acho que listá-losboostrap()
facilita o entendimento do código. Um componente possui provedores, diretivas, um modelo. Acho isso sobrecarregado sem fornecedores globais listados lá também. Por isso eu prefirobootstrap()
.alert(globalVar)
resulta em um erro.Veja, por exemplo, Angular 2 - Implementação de serviços compartilhados
ou fornecer valores individuais
fonte
bootstrap()
.bootstrap()
e componente raiz são duas coisas diferentes. Quando você liga,bootstrap(AppComponent, [MyService])
registra o serviçoboostrap()
eAppComponent
é o componente raiz. Os documentos mencionam que é preferível registrar provedores (serviço) nos componentes raiz,providers: ['MyService']
mas ainda não encontrei nenhum argumento a favor ou contrabootstrap()
ou componente raiz.Crie a classe Globals em app / globals.ts :
No seu componente:
Nota : Você pode adicionar o provedor de serviços Globals diretamente ao módulo, em vez do componente, e não precisará adicionar como provedor a todos os componentes desse módulo.
fonte
Globals
e também a adição de uma classeproviders: [ ... ]
significa que você não pode alterar um valor dentro de um componente e solicitar o valor atualizado dentro de um segundo componente. Toda vez que você injetaGlobals
, é uma nova instância. Se você deseja alterar esse comportamento, simplesmente NÃO adicioneGlobals
como provedor.@Injectable()
O IMHO para Angular2 (v2.2.3), a melhor maneira é adicionar serviços que contenham a variável global e injetá-los em componentes sem a
providers
tag dentro da@Component
anotação. Dessa forma, você pode compartilhar informações entre componentes.Um serviço de amostra que possui uma variável global:
Um componente de amostra que atualiza o valor da sua variável global:
Um componente de amostra que lê o valor da sua variável global:
fonte
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
no arquivo do módulo pai. Obrigado.Não sei a melhor maneira, mas a maneira mais fácil, se você deseja definir uma variável global dentro de um componente, é usar a
window
variável para escrever assim:window.GlobalVariable = "what ever!"
você não precisa transmiti-lo para inicializar ou importar outros locais, e é acessível globalmente a todos os JS (não apenas aos componentes angulares 2).
fonte
É assim que eu uso:
global.ts
para usá-lo, basta importar assim:
EDITADO: Eliminado o prefixo "_" conforme recomendado.
fonte
Eu acho que a melhor maneira é compartilhar um objeto com variáveis globais em todo o aplicativo, exportando e importando-o para onde você quiser.
Primeiro, crie um novo arquivo .ts, por exemplo, globals.ts e declare um objeto. Eu dei a ele um tipo de objeto, mas você também pode usar qualquer tipo ou {}
Depois disso, importe
E use
fonte
Eu gosto da resposta de @supercobra, mas usaria a palavra-chave const, pois ela já está disponível no ES6:
fonte