AngularJS e seu uso de variáveis ​​do dólar

128

Alguém sabe se o raciocínio por trás do uso de métodos e variáveis ​​dollar no angularJS é instruir o angularJS a evitar verificar esses valores quando uma digestão está ocorrendo? Então, se angular se depara $scope.$valuee $scope.value, em seguida, ele vai evitar a verificar o ex vez que é prefixado com um personagem dólar em seu nome variável?

Matsko
fonte
Veja também este post, sobre a diferença de "$ escopo" e "alcance" em AngularJS ...
Marcos
19
Angular provavelmente está tentando tirar $ $ do jQuery.
Daniel1426
Esse link é redirecionado para uma página que não explica muito sobre o escopo $.
Paul Brannan
5
Os documentos para diretiva - controlador possuem $scope, mas diretiva possui scope. WTF?
LeeGee

Respostas:

87

Algumas vezes, o Angular ignora variáveis ​​prefixadas com o cifrão:

  1. No comentário de Schumli abaixo, onde os filtros json não os produzirão
  2. Ao usar a {{ }}diretiva, angular não mostrará variáveis aninhadas $ . Por exemplo, isso exibe apenas a visiblepropriedade

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. Além disso, ao adicionar um observador explícito em um objeto de escopo, as alterações nas propriedades com um sinal de dólar inicial desse objeto não acionarão o observador. Veja este violino atualizado .

  4. angular.equals() ignora chaves prefixadas com$ .

Roy Truelove
fonte
Sim, parece que você está certo. Mesmo com eventos de clique e assim por diante, ele ainda muda. Obrigado.
matsko
7
Existem certas partes do Angular que ignoram propriedades prefixadas, por exemplo, o filtro 'json' não produzirá uma variável iniciada por '$'.
27412 Schmuli
116

É apenas uma convenção de nomenclatura do trecho abaixo http://docs.angularjs.org/tutorial/step_05

Convenção de nomenclatura do prefixo '$'
Você pode criar seus próprios serviços e, de fato, faremos exatamente isso na etapa 11. Como convenção de nomenclatura, os serviços internos da angular, os métodos Scope e algumas outras APIs angulares têm um prefixo '$' na frente do nome. Não use um prefixo '$' ao nomear seus serviços e modelos, para evitar possíveis colisões de nomes.

http://docs.angularjs.org/guide/concepts#angular_namespace

Espaço
para nome angular Para evitar colisão acidental de nomes, o Angular prefixa nomes de objetos que poderiam colidir com $. Por favor, não use o prefixo $ no seu código, pois pode colidir acidentalmente com o código Angular.

Venkat
fonte
2
Por que a diretiva doc [1] tem $scopeno controlador, mas scopena diretiva? --- [1] docs.angularjs.org/guide/directive
LeeGee
2
@LeeGee É apenas uma convenção. stackoverflow.com/a/19289054/114558
rinogo 3/16
30

O $prefixo indica uma variável, parâmetro, propriedade ou método que pertence ao núcleo do Angular.

Propriedades em objetos que se originam dentro da estrutura, mas na verdade não fazem parte da API, podem começar com $- ou até mesmo $$- para indicar um método ou propriedade particular . É da mesma maneira que o _prefixo é frequentemente usado em outras bibliotecas.

Ele não afeta a maneira como o código é interpretado pelo tempo de execução, embora a própria estrutura possa dar um significado especial. Basicamente, é uma convenção de nomenclatura que diz "Você não deve mexer com isso".

Dalgard
fonte
Eu acho que você não entendeu. O tempo de execução não se importa com o nome de variáveis. Você poderia chamá-lo $$__$_$- é apenas um identificador sem significado especial para o intérprete.
Dalgard
Adicionei algumas palavras para destacar a distinção entre tempo de execução e estrutura; tenha a gentileza de mudar seu voto.
Dalgard
7

Não tenho certeza, mas acredito que os internos do AngularJS dependem da manipulação dessas variáveis ​​com prefixo $ durante o resumo. A verificação dessas variáveis ​​significaria que o resumo nunca se estabilizaria, pois eles podem mudar constantemente durante cada ciclo do resumo.

Mas não me cite. :)

btford
fonte
10
Voto negativo por causa de: "Não me cite". Desculpe, mas uma resposta que admite incerteza não é muito útil :(
David Rivers
2
Downvote convertido para um up-. Supondo que você esteja certo, essa é agora uma resposta útil!
David Rivers
2
@DavidRivers, se a resposta inicialmente parecer hesitante, reformulá-la não a tornará mais útil. De fato, a resposta pode estar errada e a falta de hesitação afirmaria o potencial erro . Em vez disso, para que essa resposta seja considerada útil, deve-se fazer backup com algumas provas, citando fontes confiáveis ou fornecer um violino para reproduzir os pontos expressos.
Ivaylo Slavov
1
@IvayloSlavov: Concordo plenamente com você. Eu assumi (possivelmente errado) que o atendedor checou se ele estava certo e não simplesmente reformulou a resposta para remover a incerteza. Suponho que deveria ter procurado fontes ou violações.
David Rivers
1
@AlexFord: Ei, cara. Obrigado pelo pedido de desculpas! Me desculpe, eu não estava claro e comecei toda essa falta de comunicação de qualquer maneira. Seu ponto de vista é válido e eu concordo com você. Eu só queria ter certeza de que não estava sendo deturpada, mas não estava clara com minhas próprias palavras. Enfim, sem ressentimentos e eu realmente respeito que você tenha conseguido ver meu ponto de vista. Saúde, cara!
David Rios
5

Eu sempre achei que $parecia um "S" para serviço.

Marc M.
fonte
essa é a resposta correta. É lógico e simples. Esses são, de fato, serviços, portanto, é melhor lembrar que $ 'S' é para serviço. boa explicação simples.
Yonk 28/05
2
$ scope é um serviço?
deadend
5

Os sinais de dólar ( $ ) também impedem que os elementos sejam iterados (ou interpretados) em determinadas diretivas. Portanto, por exemplo, as propriedades que começam com $ não são usadas ng-repeatdevido a uma cláusula if no loop for :

if(collection.hasOwnProperty(key) && key.charAt(0) != '$')

Alguém fez um problema sobre o tópico aqui na página do angulars github


Nas shallowCopypropriedades do método que começam com $$ são ignoradas devido a uma cláusula if enquanto iteram as devidas propriedades :

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
Wilt
fonte
1

O @MarcoS forneceu o link para https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope, o que explica a diferença entre $ scope e scope. Achei isso útil, acrescentando informações às outras respostas.

Em uma diretiva angular, há um link e um controlador. O link é uma função padrão com um conjunto fixo de parâmetros: escopo, elemento, objeto de atributos.

Os argumentos do controlador são gerenciados pelo injetor Angular e não dependem da ordem. O injetor resolve quais objetos passar, procurando os parâmetros que começam com $.

O autor de https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope faz um trabalho melhor ao explicá-lo.

Bryan
fonte