AngularJS et son utilisation des variables dollar

128

Est-ce que quelqu'un sait si le raisonnement derrière l'utilisation des méthodes dollar et des variables dans angularJS est de demander à angularJS d'éviter de vérifier ces valeurs lorsqu'une digestion est en cours? Donc, si angular tombe sur $scope.$valueet $scope.value, alors il évitera de vérifier l'ancien car il est précédé d'un caractère dollar dans son nom de variable?

matsko
la source
Voir aussi ce billet de blog, sur la différence de "$ scope" et "scope" dans angularjs ...
MarcoS
19
Angular essaie probablement de retirer $ de jQuery.
daniel1426
Ce lien redirige vers une page qui n'explique pas grand chose sur $ scope.
Paul Brannan
5
La documentation pour la directive - le contrôleur a $scope, mais la directive a scope. WTF?
LeeGee

Réponses:

87

Il y a quelques fois où Angular ignore les variables précédées du signe dollar:

  1. Dans le commentaire de Schumli ci-dessous, où les filtres json ne les afficheront pas
  2. Lors de l'utilisation de la {{ }}directive, angular n'affichera pas les $ variables imbriquées . Par exemple, cela n'affiche que la visiblepropriété.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. En outre, lors de l'ajout d'un observateur explicite sur un objet d'étendue, les modifications apportées aux propriétés avec un signe dollar en tête de cet objet ne déclenchent pas l'observateur. Voir ce violon mis à jour .

  4. angular.equals() ignore les clés précédées du préfixe$ .

Roy Truelove
la source
Ouais, tu as raison. Même avec des événements de clic et ainsi de suite, cela change toujours. Je vous remercie.
matsko
7
Certaines parties d'Angular ignorent les propriétés préfixées, par exemple le filtre 'json' ne produira pas de variable commençant par '$'.
Schmuli
116

Il s'agit simplement d'une convention de dénomination tirée de l'extrait ci-dessous http://docs.angularjs.org/tutorial/step_05

Convention de nommage du préfixe '$'
Vous pouvez créer vos propres services, et en fait, nous le ferons exactement à l'étape 11. En tant que convention de nommage, les services intégrés d'angular, les méthodes Scope et quelques autres API angulaires ont un préfixe '$' devant le nom. N'utilisez pas de préfixe «$» lors de la dénomination de vos services et modèles, afin d'éviter d'éventuelles collisions de dénomination.

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

Espace de noms angulaire
Pour éviter une collision de noms accidentelle, Angular préfixe les noms d'objets qui pourraient potentiellement entrer en collision avec $. Veuillez ne pas utiliser le préfixe $ dans votre code car il pourrait entrer accidentellement en collision avec le code angulaire.

venkat
la source
2
Pourquoi la directive doc [1] a-t-elle $scopeen contrôleur, mais scopeen directive? --- [1] docs.angularjs.org/guide/directive
LeeGee
2
@LeeGee C'est juste une convention. stackoverflow.com/a/19289054/114558
rinogo
30

Le $préfixe désigne une variable, un paramètre, une propriété ou une méthode qui appartient au cœur d'Angular.

Propriétés sur les objets qui proviennent à l' intérieur du cadre, mais ne sont pas en fait une partie de l'API, peut commencer $- ou même $$- pour désigner une privée méthode ou une propriété. C'est de la même manière que le_ préfixe est souvent utilisé dans d'autres bibliothèques.

Cela n'a aucun effet sur la façon dont le code est interprété par le runtime, bien que le framework lui-même puisse lui donner une signification particulière. Fondamentalement, c'est une convention de dénomination qui dit "Vous ne devriez pas jouer avec ça".

Dalgard
la source
Je pense que vous vous méprenez. Le runtime ne se soucie pas des variables nommées. Vous pouvez l'appeler $$__$_$- c'est juste un identifiant sans signification particulière pour l'interpréteur.
dalgard
J'ai ajouté quelques mots pour souligner la distinction entre runtime et framework; ayez la gentillesse de changer votre vote.
dalgard
7

Pas tout à fait sûr, mais je pense que les composants internes d'AngularJS reposent sur la manipulation de ces variables à préfixe $ pendant le condensé. La vérification de ces variables signifierait que le digest ne se stabiliserait jamais, car elles peuvent changer constamment au cours de chaque cycle du digest.

Mais ne me citez pas là-dessus. :)

btford
la source
10
Évalué à cause de: "Ne me citez pas dessus". Désolé, mais une réponse qui admet l'incertitude n'est pas très utile :(
David Rivers
2
Downvote converti en up-. En supposant que vous avez raison, c'est maintenant une réponse utile!
David Rivers
2
@DavidRivers, si la réponse était initialement hésitante, la reformuler ne la rendra pas plus utile. En fait, la réponse peut être fausse et le manque d'hésitation affirmerait le tort potentiel . Au lieu de cela, pour que cette réponse soit considérée comme utile, elle doit être étayée par une preuve en citant des sources fiables , ou fournir un violon pour reproduire les points exprimés.
Ivaylo Slavov
1
@IvayloSlavov: Je suis tout à fait d'accord avec vous. J'ai supposé (peut-être à tort) que le répondant avait vérifié à deux reprises qu'il avait raison et qu'il n'avait pas simplement reformulé la réponse pour éliminer l'incertitude. Je suppose que j'aurais dû vouloir des sources ou des violons.
David Rivers
1
@AlexFord: Hé, mec. Merci pour les excuses! Je suis désolé de ne pas avoir été clair et d'avoir quand même commencé tout ce mal de communication. Votre argument est valable et je suis d'accord avec vous. Je voulais simplement m'assurer de ne pas être déformé, mais je n'étais pas clair avec ma propre formulation. En tout cas, pas de rancune et je respecte vraiment le fait que vous ayez pu voir mon point de vue. Bravo, mec!
David Rivers
5

J'ai toujours pensé qu'il $ressemblait à un "S" pour le service.

Marc M.
la source
c'est la bonne réponse. C'est logique et simple. Ce sont en fait des services, il vaut donc mieux se rappeler que $ 'S' est pour le service. belle explication simple.
Yonk
2
$ scope est un service?
impasse le
5

Les signes dollar ( $ ) empêchent également les éléments d'être itérés (ou interprétés) dans certaines directives. Ainsi, par exemple, les propriétés commençant par $ ne sont pas utilisées en ng-repeatraison d' une clause if dans la boucle for :

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

Quelqu'un a fait un problème sur le sujet ici sur la page angulars github


Dans la méthode, les shallowCopypropriétés commençant par $$ sont ignorées à cause d'une clause if lors de l'itération des propriétés :

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
Se flétrir
la source
1

@MarcoS a fourni le lien vers https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope qui explique une différence entre $ scope et scope. J'ai trouvé cela utile, en ajoutant aux informations dans d'autres réponses.

Dans une directive angulaire, il y a un lien et un contrôleur. Le lien est une fonction standard avec un ensemble fixe de paramètres: portée, élément, objet d'attributs.

Les arguments du contrôleur sont gérés par l'injecteur angulaire et ne dépendent pas de l'ordre. L'injecteur résout les objets à transmettre en recherchant les paramètres commençant par $.

L'auteur de https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope fait un meilleur travail pour l'expliquer.

Bryan
la source