AngularJS und seine Verwendung von Dollarvariablen


128

Weiß jemand, ob der Grund für die Verwendung von Dollar-Methoden und -Variablen in angleJS darin besteht, angularJS anzuweisen, diese Werte nicht zu überprüfen, wenn eine Verdauung stattfindet? Wenn also eckig auf $scope.$valueund stößt $scope.value, wird die erstere nicht überprüft, da dem Variablennamen ein Dollarzeichen vorangestellt ist.


Siehe auch diesen Blog-Beitrag über den Unterschied zwischen "$ scope" und "scope" in anglejs ...
MarcoS

19
Angular versucht wahrscheinlich, jQuery $ wegzunehmen.
Daniel1426

Dieser Link leitet zu einer Seite weiter, die nicht viel über $ scope erklärt.
Paul Brannan

5
Die Dokumente für Direktive - Controller hat $scope, aber Direktive hat scope. WTF?
LeeGee

Antworten:


87

Angular ignoriert einige Male Variablen, denen das Dollarzeichen vorangestellt ist:

  1. In Schummis Kommentar unten, wo JSON-Filter sie nicht ausgeben
  2. Bei Verwendung der {{ }}Direktive zeigt Angular keine verschachtelten $ Variablen an. Dies zeigt beispielsweise nur die visibleEigenschaft an.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. Wenn Sie einem Bereichsobjekt einen expliziten Watcher hinzufügen, wird der Watcher durch Änderungen an Eigenschaften mit einem führenden Dollarzeichen dieses Objekts nicht ausgelöst. Siehe diese aktualisierte Geige .

  4. angular.equals() ignoriert Schlüssel mit dem Präfix$ .


Ja, sieht so aus, als hättest du recht. Auch bei Klickereignissen usw. ändert sich dies immer noch. Danke dir.
Matsko

7
Es gibt bestimmte Teile von Angular, die vorangestellte Eigenschaften ignorieren. Beispielsweise gibt der Filter 'json' keine Variable aus, die mit '$' beginnt.
Schmuli

116

Es ist nur eine Namenskonvention aus dem folgenden Snippet http://docs.angularjs.org/tutorial/step_05

Namenskonvention für Präfixe '$'
Sie können Ihre eigenen Dienste erstellen, und genau das werden wir in Schritt 11 tun. Als Namenskonvention haben die integrierten Dienste, Bereichsmethoden und einige andere Winkel-APIs von Angular ein Präfix '$' vor dem Namen. Verwenden Sie beim Benennen Ihrer Dienste und Modelle kein Präfix '$', um mögliche Namenskollisionen zu vermeiden.

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

Angular Namespace
Um eine versehentliche Namenskollision zu verhindern, stellt Angular Namen von Objekten voran, die möglicherweise mit $ kollidieren könnten. Bitte verwenden Sie das $ -Präfix nicht in Ihrem Code, da es versehentlich mit Angular-Code kollidieren kann.


2
Warum hat die Direktive doc [1] $scopein Controller, aber scopein Direktive? --- [1] docs.angularjs.org/guide/directive
LeeGee

2
@ LeeGee Es ist nur Konvention. stackoverflow.com/a/19289054/114558
Rinogo

30

Das $Präfix bezeichnet eine Variable, einen Parameter, eine Eigenschaft oder eine Methode, die zum Kern von Angular gehört.

Eigenschaften für Objekte, die aus dem Framework stammen, aber nicht Teil der API sind, können mit $oder sogar $$mit einer privaten Methode oder Eigenschaft beginnen. Auf diese Weise wird das _Präfix häufig in anderen Bibliotheken verwendet.

Es hat keinen Einfluss auf die Art und Weise, wie Code von der Laufzeit interpretiert wird, obwohl das Framework selbst ihm möglicherweise eine besondere Bedeutung gibt. Grundsätzlich handelt es sich um eine Namenskonvention, die besagt, dass Sie sich damit nicht anlegen sollten.


Ich denke du verstehst falsch. Der Laufzeit ist es egal, welche Variablen benannt sind. Man könnte es nennen $$__$_$- es ist nur eine Kennung ohne besondere Bedeutung für den Dolmetscher.
Dalgard

Ich habe ein paar Worte hinzugefügt, um die Unterscheidung zwischen Laufzeit und Framework hervorzuheben. Sei so freundlich, deine Stimme zu ändern.
Dalgard

7

Ich bin mir nicht ganz sicher, aber ich glaube, dass AngularJS-Interna darauf angewiesen sind, diese $ -präfixierten Variablen während des Digests zu manipulieren. Das Überprüfen dieser Variablen würde bedeuten, dass sich der Digest niemals stabilisieren würde, da sie sich während jedes Digestzyklus ständig ändern können.

Zitiere mich aber nicht darauf. :) :)


10
Abgestuft wegen: "Zitiere mich nicht darauf". Entschuldigung, aber eine Antwort, die Unsicherheit zulässt, ist nicht sehr nützlich :(
David Rivers

2
Downvote in up- umgewandelt. Vorausgesetzt, Sie haben Recht, ist dies jetzt eine nützliche Antwort!
David Rivers

2
@DavidRivers, wenn die Antwort anfänglich zögerlich war, wird eine Neuformulierung sie nicht nützlicher machen. Tatsächlich kann die Antwort falsch sein, und das Fehlen von Zögern würde die potenzielle Falschheit bestätigen . Damit diese Antwort als nützlich angesehen werden kann, sollte sie durch Zitieren vertrauenswürdiger Quellen mit einem Beweis belegt werden , oder es sollte eine Geige bereitgestellt werden, um die geäußerten Punkte zu reproduzieren.
Ivaylo Slavov

1
@ IvayloSlavov: Ich stimme dir absolut zu. Ich nahm (möglicherweise zu Unrecht) an, dass der Antwortende noch einmal überprüft hat, ob er Recht hat, und die Antwort nicht einfach umformuliert hat, um Unsicherheit zu beseitigen. Ich denke, ich hätte Quellen oder Geigen haben wollen.
David Rivers

1
@ AlexFord: Hey, Mann. Danke für die Entschuldigung! Es tut mir leid, dass ich nicht klar war und trotzdem mit all diesen Missverständnissen angefangen habe. Ihr Punkt ist gültig und ich stimme Ihnen zu. Ich wollte nur sicherstellen, dass ich nicht falsch dargestellt werde, aber ich war mit meinem eigenen Wortlaut nicht klar. Wie auch immer, keine harten Gefühle und ich respektiere wirklich, dass Sie meinen Standpunkt sehen konnten. Prost, Mann!
David Rivers

5

Ich dachte immer, es $sieht aus wie ein "S" für den Service.


Das ist die richtige Antwort. Es ist logisch und einfach. Dies sind in der Tat Dienste, daher ist es besser, sich daran zu erinnern, dass $ 'S' für den Dienst bestimmt ist. schöne einfache Erklärung.
Yonk

2
$ scope ist ein Service?
Deadend

5

Dollarzeichen ( $ ) verhindern auch, dass Elemente in bestimmten Anweisungen wiederholt (oder interpretiert) werden. So werden beispielsweise Eigenschaften, die mit $ beginnen, ng-repeataufgrund einer if-Klausel in der for-Schleife nicht verwendet :

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

Jemand hat hier auf der Angulars Github-Seite ein Problem mit dem Thema gemacht


In der Methode werden shallowCopyEigenschaften, die mit $$ beginnen, aufgrund einer if-Klausel übersprungen , während die Eigenschaften wiederholt werden :

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

1

@MarcoS stellte den Link zu https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope bereit, der einen Unterschied zwischen $ scope und scope erklärt. Ich fand das nützlich und fügte den Informationen in anderen Antworten hinzu.

In einer Winkelanweisung gibt es eine Verbindung und eine Steuerung. Der Link ist eine Standardfunktion mit einem festen Satz von Parametern: Bereich, Element, Attributobjekt.

Die Argumente des Controllers werden vom Angular-Injektor verwaltet und sind nicht auftragsabhängig. Der Injektor entscheidet, welche Objekte übergeben werden sollen, indem er nach den Parametern sucht, die mit $ beginnen.

Der Autor von https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope erklärt dies besser.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.