AngularJS e il suo uso delle variabili in dollari


128

Qualcuno sa se il ragionamento alla base dell'uso dei metodi e delle variabili del dollaro in angularJS è di istruire angularJS per evitare di controllare quei valori quando sta avvenendo una digestione? Quindi, se si incontra angolare $scope.$valuee $scope.value, allora eviterà di controllare il primo poiché ha il prefisso con un carattere di dollaro nel suo nome variabile?


Vedi anche questo post sul blog, sulla differenza di "$ scope" e "scope" in angularjs ...
MarcoS

19
Probabilmente Angular sta cercando di togliere $ da jQuery.
daniel1426,

Quel link reindirizza a una pagina che non spiega molto su $ scope.
Paul Brannan,

5
I documenti per direttiva - controller ha $scope, ma direttiva ha scope. WTF?
LeeGee,

Risposte:


87

Ci sono alcune volte che Angolare ignora le variabili con il segno del dollaro:

  1. Nel commento di Schumli di seguito, in cui i filtri json non li genereranno
  2. Quando si utilizza la {{ }}direttiva, angolare non mostrerà le $ variabili nidificate . Ad esempio, questo visualizza solo la visibleproprietà.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. Inoltre, quando si aggiunge un watcher esplicito su un oggetto scope, le modifiche alle proprietà con un segno di dollaro iniziale di questo oggetto non attiveranno il watcher. Vedi questo violino aggiornato .

  4. angular.equals() ignora i tasti con il prefisso$ .


Sì, sembra che tu abbia ragione. Anche con eventi click e così via, cambia ancora. Grazie.
Matsko,

7
Ci sono alcune parti di Angular che ignorano le proprietà con prefisso, ad esempio il filtro 'json' non produrrà una variabile che inizia con '$'.
Schmuli,

116

È solo una convenzione di denominazione dal frammento di seguito http://docs.angularjs.org/tutorial/step_05

Convenzione di denominazione del prefisso "$"
Puoi creare i tuoi servizi, e di fatto lo faremo esattamente al punto 11. Come convenzione di denominazione, i servizi integrati di Angular, i metodi Scope e alcune altre API angolari hanno un prefisso "$" di fronte al nome. Non utilizzare un prefisso '$' durante la denominazione dei servizi e dei modelli, al fine di evitare possibili collisioni di denominazione.

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

Spazio dei nomi angolare
Per prevenire la collisione accidentale dei nomi, i prefissi angolari nominano gli oggetti che potrebbero potenzialmente scontrarsi con $. Non utilizzare il prefisso $ nel codice poiché potrebbe scontrarsi accidentalmente con il codice angolare.


2
Perché la direttiva doc [1] ha $scopenel controller, ma scopenella direttiva? --- [1] docs.angularjs.org/guide/directive
LeeGee

2
@LeeGee È solo una convenzione. stackoverflow.com/a/19289054/114558
rinogo

30

Il $ prefisso indica una variabile, un parametro, una proprietà o un metodo che appartiene al nucleo di Angular.

Le proprietà sugli oggetti che hanno origine all'interno del framework, ma che in realtà non fanno parte dell'API, possono iniziare $- o addirittura $$- per indicare un metodo o una proprietà privata . Questo è allo stesso modo il_ prefisso viene spesso utilizzato in altre librerie.

Non ha alcun effetto sul modo in cui il codice viene interpretato dal runtime, sebbene il framework stesso possa dargli un significato speciale. Fondamentalmente, è una convenzione di denominazione che dice "Non dovresti sbagliare con questo".


Penso che tu abbia frainteso. Al runtime non importa quali variabili siano chiamate. Potresti chiamarlo $$__$_$- è solo un identificatore senza un significato speciale per l'interprete.
Dalgard,

Ho aggiunto alcune parole per evidenziare la distinzione tra runtime e framework; sii così gentile da cambiare il tuo voto.
Dalgard,

7

Non sono del tutto sicuro, ma credo che gli interni di AngularJS facciano affidamento sulla manipolazione di queste variabili $ prefissate durante il digest. Il controllo di queste variabili significherebbe che il digest non si stabilizzerebbe mai, poiché potrebbero cambiare costantemente durante ogni ciclo del digest.

Non citarmi però. :)


10
Downvoted a causa di: "Non citarmi su di esso". Siamo spiacenti, ma una risposta che ammette l'incertezza non è molto utile :(
David Rivers,

2
Downvote convertito in up-. Supponendo che tu abbia ragione, questa è ora una risposta utile!
David Rivers,

2
@DavidRivers, se inizialmente la risposta è stata esitante, riformattarla non la renderà più utile. In effetti, la risposta può essere sbagliata e la mancanza di esitazione affermerebbe il potenziale errore . Invece, affinché questa risposta sia considerata utile, dovrebbe essere supportata da alcune prove citando fonti attendibili o fornendo un violino per riprodurre i punti espressi.
Ivaylo Slavov,

1
@IvayloSlavov: sono assolutamente d'accordo con te. Ho ipotizzato (forse erroneamente) che il rispondente ricontrollasse che aveva ragione e non semplicemente riformulare la risposta per rimuovere l'incertezza. Suppongo che avrei dovuto desiderare fonti o violini.
David Rivers,

1
@AlexFord: Ehi, amico. Grazie per le scuse! Mi dispiace di non essere stato chiaro e ho iniziato comunque tutti questi errori di comunicazione. Il tuo punto è valido e sono d'accordo con te. Volevo solo assicurarmi di non essere stato travisato, ma non ero chiaro con le mie parole. Comunque, nessun sentimento duro e rispetto davvero che tu sia stato in grado di vedere il mio punto di vista. Saluti, amico!
David Rivers,

5

Ho sempre pensato che $fosse una "S" per il servizio.


questa è la risposta corretta. È logico e semplice. Questi sono in effetti servizi, quindi è meglio ricordare che $ 'S' è per il servizio. bella spiegazione semplice.
Yonk,

2
$ scope è un servizio?
deadend

5

I segni del dollaro ( $ ) impediscono inoltre che gli elementi vengano ripetuti (o interpretati) in alcune direttive. Quindi, ad esempio, le proprietà che iniziano con $ non vengono utilizzate a ng-repeatcausa di una clausola if nel ciclo for :

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

Qualcuno ha fatto un problema sull'argomento qui sulla pagina degli angolari di github


Nel metodo le shallowCopyproprietà che iniziano con $$ vengono ignorate a causa di una clausola if durante l'iterazione delle proprietà :

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

1

@MarcoS ha fornito il collegamento a https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope che spiega una differenza tra $ scope e scope. L'ho trovato utile, aggiungendo alle informazioni in altre risposte.

In una direttiva angolare c'è un collegamento e un controller. Il collegamento è una funzione standard con un set fisso di parametri: ambito, elemento, attributi oggetto.

Gli argomenti del controller sono gestiti dall'iniettore angolare e non dipendono dall'ordine. L'iniettore risolve gli oggetti da passare cercando i parametri che iniziano con $.

L'autore di https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope fa un lavoro migliore nel spiegarlo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.