AngularJS y su uso de variables de dólar

128

¿Alguien sabe si el razonamiento detrás del uso de métodos y variables de dólar en angularJS es instruir a angularJS para evitar verificar esos valores cuando se está produciendo una digestión? Entonces, si aparece angular $scope.$valuey $scope.value, ¿evitará verificar el primero ya que está prefijado con un carácter de dólar en su nombre variable?

Matsko
fuente
Vea también esta publicación de blog, sobre la diferencia de "$ scope" y "scope" en angularjs ...
MarcoS
19
Angular probablemente esté tratando de quitar $ de jQuery.
daniel1426
Ese enlace redirige a una página que no explica mucho sobre $ scope.
Paul Brannan
55
Los documentos para la directiva: el controlador tiene $scope, pero la directiva sí scope. WTF?
LeeGee

Respuestas:

87

Hay algunas veces que Angular ignora las variables prefijadas con el signo de dólar:

  1. En el comentario de Schumli a continuación, donde los filtros json no los generarán
  2. Al usar la {{ }}directiva, angular no mostrará variables anidadas $ . Por ejemplo, esto solo muestra la visiblepropiedad.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. Además, al agregar un observador explícito en un objeto de alcance, los cambios en las propiedades con un signo de dólar inicial de este objeto no activarán el observador. Ver este violín actualizado .

  4. angular.equals() ignora las teclas con el prefijo$ .

Roy Truelove
fuente
Sí, parece que tienes razón. Incluso con eventos de clic, etc., todavía cambia. Gracias.
matsko
77
Hay ciertas partes de Angular que ignoran las propiedades prefijadas, por ejemplo, el filtro 'json' no generará una variable que comience con '$'.
Schmuli
116

Es solo una convención de nomenclatura del fragmento siguiente http://docs.angularjs.org/tutorial/step_05

Convención de nomenclatura de prefijo '$'
Puede crear sus propios servicios, y de hecho haremos exactamente eso en el paso 11. Como convención de nomenclatura, los servicios integrados de angular, los métodos de alcance y algunas otras API angulares tienen un prefijo '$' delante del nombre No use el prefijo '$' al nombrar sus servicios y modelos, para evitar posibles colisiones de nombres.

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

Espacio de nombres angular
Para evitar la colisión accidental de nombres, los prefijos angulares nombres de objetos que podrían colisionar con $. No utilice el prefijo $ en su código, ya que puede chocar accidentalmente con el código angular.

Venkat
fuente
2
¿Por qué la directiva doc [1] tiene $scopeen el controlador, pero scopeen la directiva? --- [1] docs.angularjs.org/guide/directive
LeeGee
2
@LeeGee Es solo una convención. stackoverflow.com/a/19289054/114558
rinogo
30

El $prefijo denota una variable, parámetro, propiedad o método que pertenece al núcleo de Angular.

Las propiedades en los objetos que se originan dentro del marco, pero que en realidad no son parte de la API, pueden comenzar con $, o incluso $$, para denotar un método o propiedad privada . Esta es la misma forma en que el _prefijo se usa a menudo en otras bibliotecas.

No tiene ningún efecto sobre la forma en que el tiempo de ejecución interpreta el código, aunque el marco en sí mismo puede darle un significado especial. Básicamente, es una convención de nombres que dice "No deberías meterte con esto".

dalgard
fuente
Creo que lo malinterpretas. El tiempo de ejecución no le importa qué variables se nombran. Podría llamarlo $$__$_$: es solo un identificador sin un significado especial para el intérprete.
dalgard
Agregué algunas palabras para resaltar la distinción entre tiempo de ejecución y marco; Sea tan amable de cambiar su voto.
dalgard
7

No estoy completamente seguro, pero creo que las partes internas de AngularJS dependen de la manipulación de estas variables con prefijo $ durante el resumen. Verificar estas variables significaría que el resumen nunca se estabilizaría, ya que pueden cambiar constantemente durante cada ciclo del resumen.

Sin embargo, no me cites. :)

btford
fuente
10
Votado a favor debido a: "No me cites". Lo sentimos, pero una respuesta que admite incertidumbre no es muy útil :(
David Rivers
2
Downvote convertido en un up-. Asumiendo que tienes razón, ¡esta es una respuesta útil!
David Rivers
2
@DavidRivers, si la respuesta inicialmente fue vacilante, volver a redactarla no la hará más útil. De hecho, la respuesta puede ser incorrecta y la falta de vacilación afirmaría la potencial equivocación . En cambio, para que esta respuesta se considere útil, debe respaldarse con alguna prueba citando fuentes confiables , o proporcionar un violín para reproducir los puntos expresados.
Ivaylo Slavov
1
@IvayloSlavov: Estoy absolutamente de acuerdo contigo. Supuse (posiblemente erróneamente) que el respondedor verificó dos veces que tenía razón y no simplemente reformuló la respuesta para eliminar la incertidumbre. Supongo que debería haber querido fuentes o violines.
David Rivers
1
@ AlexFord: Hola, hombre. Gracias por la disculpa! Lo siento, no estaba claro y comencé toda esta falta de comunicación de todos modos. Su punto es válido y estoy de acuerdo con usted. Solo quería asegurarme de que no estaba siendo tergiversada, pero no estaba claro con mi propia redacción. De todos modos, no tengo resentimientos y realmente respeto que pudiste ver mi punto de vista. ¡Salud Amigo!
David Rivers
5

Siempre pensé que $se parecía a una "S" para el servicio.

Marc M.
fuente
Esa es la respuesta correcta. Es lógico y simple. De hecho, estos son servicios, por lo que es mejor recordar que $ 'S' es por servicio. Buena explicación simple.
Yonk
2
$ scope es un servicio?
muerto el
5

Los signos de dólar ( $ ) también evitan que los elementos se repitan (o interpreten) en ciertas directivas. Entonces, por ejemplo, las propiedades que comienzan con $ no se usan ng-repeatdebido a una cláusula if en el ciclo for :

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

Alguien hizo un problema sobre el tema aquí en la página de Angular Github


En el método, las shallowCopypropiedades que comienzan con $$ se omiten debido a una cláusula if al iterar las propiedades :

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

@MarcoS proporcionó el enlace a https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope que explica la diferencia entre $ scope y scope. Encontré esto útil, agregando a la información en otras respuestas.

En una directiva angular hay un enlace y un controlador. El enlace es una función estándar con un conjunto fijo de parámetros: alcance, elemento, objeto de atributos.

Los argumentos del controlador son gestionados por el inyector angular y no dependen del orden. El inyector resuelve qué objetos pasar buscando los parámetros que comienzan con $.

El autor de https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope hace un mejor trabajo al explicarlo.

Bryan
fuente