Soy muy nuevo en AngularJS. ¿Alguien puede explicarme la diferencia entre estos operadores de AngularJS: &, @ and =
al aislar el alcance con el ejemplo adecuado?
javascript
angularjs
Nur Rony
fuente
fuente
Respuestas:
@
permite que un valor definido en el atributo de directiva se pase al ámbito de aislamiento de la directiva. El valor podría ser un valor de cadena simple (myattr="hello"
) o podría ser una cadena interpolada AngularJS con expresiones incrustadas (myattr="my_{{helloText}}"
). Piense en ello como una comunicación "unidireccional" desde el alcance de los padres hacia la directiva del niño. John Lindquist tiene una serie de videos cortos que explican cada uno de estos. Screencast en @ está aquí: https://egghead.io/lessons/angularjs-isolate-scope-attribute-binding&
permite que el ámbito de aislamiento de la directiva pase valores al ámbito principal para su evaluación en la expresión definida en el atributo. Tenga en cuenta que el atributo directivo es implícitamente una expresión y no utiliza la sintaxis de expresión de doble llave. Este es más difícil de explicar en el texto. Screencast en y está aquí: https://egghead.io/lessons/angularjs-isolate-scope-expression-binding=
configura una expresión de enlace bidireccional entre el ámbito de aislamiento de la directiva y el ámbito primario. Los cambios en el ámbito secundario se propagan al padre y viceversa. Piense en = como una combinación de @ y &. Screencast on = está aquí: https://egghead.io/lessons/angularjs-isolate-scope-two-way-bindingY finalmente aquí hay un screencast que muestra los tres utilizados juntos en una sola vista: https://egghead.io/lessons/angularjs-isolate-scope-review
fuente
Me gustaría explicar los conceptos desde la perspectiva de la herencia del prototipo de JavaScript. Con suerte ayuda a entender.
Hay tres opciones para definir el alcance de una directiva:
scope: false
: Predeterminado angular. El alcance de la directiva es exactamente el de su alcance padre (parentScope
).scope: true
: Angular crea un ámbito para esta directiva. El alcance hereda prototípicamente deparentScope
.scope: {...}
: el alcance aislado se explica a continuación.Especificar
scope: {...}
define unisolatedScope
. AnisolatedScope
no hereda propiedades deparentScope
, aunqueisolatedScope.$parent === parentScope
. Se define a través de:isolatedScope
no tiene acceso directo aparentScope
. Pero a veces la directiva necesita comunicarse con elparentScope
. Se comunican a través de@
,=
y&
. El tema sobre el uso de los símbolos@
,=
y&
estamos hablando de escenarios utilizandoisolatedScope
.Por lo general, se usa para algunos componentes comunes compartidos por diferentes páginas, como Modals. Un alcance aislado evita contaminar el alcance global y es fácil de compartir entre páginas.
Aquí hay una directiva básica: http://jsfiddle.net/7t984sf9/5/ . Una imagen para ilustrar es:
@
: enlace unidireccional@
simplemente pasa la propiedad deparentScope
aisolatedScope
. Se llamaone-way binding
, lo que significa que no puede modificar el valor de lasparentScope
propiedades. Si está familiarizado con la herencia de JavaScript, puede comprender estos dos escenarios fácilmente:Si la propiedad de enlace es un tipo primitivo, como
interpolatedProp
en el ejemplo: puede modificarinterpolatedProp
, peroparentProp1
no se cambiaría. Sin embargo, si cambia el valor deparentProp1
,interpolatedProp
se sobrescribirá con el nuevo valor (cuando angular $ digest).Si la propiedad de enlace es algún objeto, como
parentObj
: dado que el que se pasaisolatedScope
es una referencia, la modificación del valor activará este error:TypeError: Cannot assign to read only property 'x' of {"x":1,"y":2}
=
: enlace bidireccional=
se llamatwo-way binding
, lo que significa que cualquier modificación enchildScope
también actualizará el valor enparentScope
, y viceversa. Esta regla funciona tanto para primitivos como para objetos. Si cambia el tipo de enlace deparentObj
ser=
, verá que puede modificar el valor deparentObj.x
. Un ejemplo típico esngModel
.&
: enlace de función&
permite que la directiva llame a algunaparentScope
función y pase algún valor de la directiva. Por ejemplo, marque JSFiddle: & en el alcance de la directiva .Defina una plantilla cliqueable en la directiva como:
Y usa la directiva como:
La variable
valueFromDirective
se pasa de la directiva al controlador principal a través de{valueFromDirective: ...
.Referencia: Comprender los ámbitos
fuente
No es mi violín, pero http://jsfiddle.net/maxisam/QrCXh/ muestra la diferencia. La pieza clave es:
fuente
@ : enlace unidireccional
= : enlace bidireccional
& : enlace de función
fuente
AngularJS - Ámbitos aislados - @ vs = vs &
Ejemplos breves con explicación están disponibles en el siguiente enlace:
http://www.codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs
@ - enlace unidireccional
En directiva:
En vista:
= - enlace bidireccional
En directiva:
En vista:
& - Llamada de función
En directiva:
En vista:
fuente
Me llevó muchísimo tiempo entender realmente esto. La clave para mí fue comprender que "@" es para cosas que desea evaluar in situ y pasar a la directiva como una constante donde "=" realmente pasa el objeto en sí.
Hay una buena publicación de blog que explica esto en: http://blog.ramses.io/technical/AngularJS-the-difference-between-@-&-and-=-when-declaring-directives-using-isolate-scopes
fuente