Eu tenho um problema em que estou inicializando uma variável no escopo em um controlador. Em seguida, ele é alterado em outro controlador quando um usuário efetua login. Essa variável é usada para controlar itens como a barra de navegação e restringe o acesso a partes do site, dependendo do tipo de usuário, por isso é importante que ele mantenha seu valor. O problema é que o controlador que o inicializa, é chamado novamente de alguma forma angular e, em seguida, redefine a variável de volta ao seu valor inicial.
Eu suponho que essa não é a maneira correta de declarar e inicializar variáveis globais, bem, não é realmente global, então minha pergunta é qual é a maneira correta e existem bons exemplos em torno desse trabalho com a versão atual do angular?
fonte
Respostas:
Você tem basicamente 2 opções para variáveis "globais":
$rootScope
http://docs.angularjs.org/api/ng.$rootScope$rootScope
é pai de todos os escopos; portanto, os valores expostos serão visíveis em todos os modelos e controladores. Usar o$rootScope
é muito fácil, pois você pode simplesmente injetá-lo em qualquer controlador e alterar valores nesse escopo. Pode ser conveniente, mas tem todos os problemas de variáveis globais .Os serviços são singletons que você pode injetar em qualquer controlador e expor seus valores no escopo de um controlador. Serviços, sendo singletons ainda são 'globais', mas você tem um controle muito melhor sobre onde eles são usados e expostos.
O uso de serviços é um pouco mais complexo, mas não tanto, aqui está um exemplo:
e depois em um controlador:
Aqui está o jsFiddle em funcionamento: http://jsfiddle.net/pkozlowski_opensource/BRWPM/2/
fonte
Se você deseja apenas armazenar um valor, de acordo com a documentação Angular sobre provedores , use a receita Valor:
Em seguida, use-o em um controlador como este:
O mesmo pode ser alcançado usando um provedor, fábrica ou serviço, pois eles são "apenas açúcar sintático em cima de uma receita de provedor", mas o uso do Value alcançará o que você deseja com uma sintaxe mínima.
A outra opção é usar
$rootScope
, mas não é realmente uma opção, porque você não deve usá-la pelos mesmos motivos que não deve usar variáveis globais em outros idiomas. É aconselhável que seja usado com moderação.Como todos os escopos são herdados
$rootScope
, se você tiver uma variável$rootScope.data
e alguém esquecer quedata
já está definido e cria$scope.data
em um escopo local, você terá problemas.Se você deseja modificar esse valor e persistir em todos os seus controladores, use um objeto e modifique as propriedades, lembrando que o Javascript é passado por "cópia de uma referência" :
Exemplo JSFiddle
fonte
clientId
pode ser atualizada?Exemplo de "variáveis globais" do AngularJS usando
$rootScope
:O controlador 1 define a variável global:
O controlador 2 lê a variável global:
Aqui está um jsFiddle em funcionamento: http://jsfiddle.net/natefriedman/3XT3F/1/
fonte
No interesse de adicionar outra idéia ao pool do wiki, mas e o AngularJS
value
e osconstant
módulos? Só estou começando a usá-los, mas parece-me que essas são provavelmente as melhores opções aqui.Nota: até o momento em que este artigo foi escrito, o Angular 1.3.7 é o último estábulo, acredito que eles foram adicionados no 1.2.0, mas não o confirmaram com o changelog.
Dependendo de quantos você precisa definir, convém criar um arquivo separado para eles. Mas geralmente os defino antes do
.config()
bloqueio do meu aplicativo para facilitar o acesso. Como ainda são módulos efetivamente, você precisará confiar na injeção de dependência para usá-los, mas eles são considerados "globais" para o seu módulo de aplicativo.Por exemplo:
Depois, dentro de qualquer controlador:
A partir da pergunta inicial, na verdade, parece que as propriedades estáticas são necessárias aqui de qualquer maneira, seja mutável (valor) ou final (constante). É mais minha opinião pessoal do que qualquer outra coisa, mas acho que colocar itens de configuração de tempo de execução no
$rootScope
fica muito confuso, muito rapidamente.fonte
No seu HTML:
fonte
Se você tem a garantia de estar em um navegador moderno. Embora saiba que seus valores serão todos transformados em strings.
Também tem o benefício útil de ser armazenado em cache entre recarregamentos.
fonte
Corrija-me se estiver errado, mas quando o Angular 2.0 for lançado, não acredito que
$rootScope
existirá. Minha conjectura é baseada no fato de que também$scope
está sendo removida. Obviamente, os controladores ainda existirão, mas não dang-controller
moda. Pense em injetar controladores nas diretivas. Como o lançamento é iminente, será melhor usar os serviços como variáveis globais, se você quiser um tempo mais fácil para mudar da versão 1.X para a versão 2.0.fonte
Você também pode usar a variável de ambiente
$window
para que uma variável global declarada fora de um controlador possa ser verificada dentro de um$watch
Por certo, o ciclo de resumo é mais longo com esses valores globais, portanto nem sempre é atualizado em tempo real. Eu preciso investigar esse tempo de digestão com esta configuração.
fonte
Acabei de encontrar outro método por engano:
O que eu fiz foi declarar uma
var db = null
declaração de aplicativo acima e modificá-la noapp.js
momento em que eu a acessei, econtroller.js
consegui acessá-la sem nenhum problema.Pode haver alguns problemas com esse método que eu não conheço, mas é uma boa solução, eu acho.fonte
Tente isso, você não forçará a injetar
$rootScope
no controlador.Você pode usá-lo apenas no bloco de execução, porque o bloco de configuração não fornecerá o serviço do $ rootScope.
fonte
Na verdade, é bem fácil. (Se você estiver usando o Angular 2+ de qualquer maneira.)
Basta adicionar
Em algum lugar na parte superior do arquivo do componente (como após as instruções "import"), você poderá acessar "myGlobalVarName" em qualquer lugar do componente.
fonte
Você também pode fazer algo assim ..
fonte