¿Cuál es la forma más fácil de pasar una variable de alcance AngularJS de la directiva al controlador? Todos los ejemplos que he visto parecen tan complejos, ¿no hay alguna forma de acceder a un controlador desde una directiva y establecer una de sus variables de alcance?
angularjs
angularjs-directive
ng-controller
juguete de cuerda
fuente
fuente
Respuestas:
Editado el 25/8/2014: Aquí fue donde lo bifurqué.
Gracias @anvarik.
Aquí está el JSFiddle . Olvidé dónde bifurqué esto. Pero este es un buen ejemplo que muestra la diferencia entre = y @
fuente
Espere hasta que angular haya evaluado la variable
Tuve que jugar mucho con esto y no pude hacer que funcionara incluso con la variable definida
"="
en el alcance. Aquí hay tres soluciones según su situación.Solución # 1
Descubrí que la variable aún no había sido evaluada por angular cuando se pasó a la directiva. Esto significa que puede acceder a él y usarlo en la plantilla, pero no dentro del enlace o la función del controlador de la aplicación, a menos que esperemos a que se evalúe.
Si su variable está cambiando o se obtiene a través de una solicitud, debe usar
$observe
o$watch
:Y aquí está el html (¡recuerde los corchetes!):
Tenga en cuenta que no debe establecer la variable en
"="
en el alcance, si está utilizando la$observe
función. Además, descubrí que pasa objetos como cadenas, por lo que si está pasando objetos, use la solución n. ° 2 oscope.$watch(attrs.yourDirective, fn)
(, o n . ° 3 si su variable no está cambiando).Solución # 2
Si su variable se crea, por ejemplo, en otro controlador , pero solo necesita esperar hasta que angular la haya evaluado antes de enviarla al controlador de la aplicación, podemos usar
$timeout
para esperar hasta que se$apply
haya ejecutado. También necesitamos usar$emit
para enviarlo al controlador de la aplicación de alcance principal (debido al alcance aislado en la directiva):Y aquí está el html (¡sin corchetes!):
Solución # 3
Si su variable no cambia y necesita evaluarla en su directiva, puede usar la
$eval
función:Y aquí está el html (¡recuerde los corchetes!):
Además, eche un vistazo a esta respuesta: https://stackoverflow.com/a/12372494/1008519
Referencia para el problema de FOUC (flash of unstyled content): http://deansofer.com/posts/view/14/AngularJs-Tips-and-Tricks-UPDATED
Para los interesados: aquí hay un artículo sobre el ciclo de vida angular.
fuente
ng-if="someObject.someVariable"
en la directiva (o el elemento con la directiva como atributo) es suficiente: la directiva se activa solo después de quesomeObject.someVariable
se define.