Comunicándose con el exterior
La directiva puede comunicar con el exterior:
-
A través del scope
-
Mediante atributos
La segunda opción suele ser mejor, aunque siempre hay excepciones.
Usando el Scope
Como ocurre en los controladores,
el scope se copia por defecto:
- los tipos básicos por valor
- los objetos por referencia
Usando atributos.
Es la mejor manera.
Conviene empezar aislándose del scope padre
.directive('miDirectiva', function () {
return {
//...
scope: {},
//...
}
})
Al definir un scope:{}
, la directiva tendrá un scope limpio, que no heredará las propiedades del scope del contenedor.
Tres formas de comunicación:
.directive('miDirectiva', function () {
return {
//...
scope: {
"a": "@",
"b1": "@b2",
"c": "=",
"d1": "=d2",
"e": "&",
"f1": "&f2"
},
//...
},
})
La primera forma:
@ o @attr
Pista: arroba es "at", como de atributo.
Se recibe el valor del atributo, es decir, si es de la forma:
<midirectiva miatributo='algoPasaCon{{nombre}}'/>
y en el contenedor
$scope.nombre='Mary'
entonces en la directiva, el scope local tendrá
scope.miatributo='algoPasaConMary'
La segunda forma:
= o =attr
Pista: igual. El scope local con el padre.
Crea un bind bidireccional entre la propiedad del scope
local y la que se haya referenciado en el padre.
<midirectiva miatributo='propiedadP'/>
y en el contenedor
$scope.propiedadP = 'Yo soy tu padre'
entonces en la directiva, el scope local tendrá
scope.miatributo == 'Yo soy tu padre'
//el valor de propiedadP en el scope del padre, siempre actualizado
La tercera forma:
& o &attr
Pista: & es como un puntero en C. Devuelve una función.
Devuelve una función
que ejecutará la expresión
del atributo contra el scope del padre. El scope se puede
extender en el momento de la ejecución
con valores adicionales.
Un ejemplo habitual es ng-click.
"Transclusion", el palabro más raro
(Lo que viene a ser <content> en webcomponents).
Hay que activar la transclusión:
.directive('midirectiva', function () {
return {
//...
transclude: true,
//..
};
});
Y luego usar:
ng-transclude
Esta directiva marca el punto de inserción del DOM de la directiva padre más cercana que tenga activada la transclusión.