Hasta ahora hemos usado las directivas de AngularJS , en esta unidad vamos a ver como crear nuestra propias directivas.
¿Cual es la utilidad de crear nuestras propias directivas? Pues es simplemente es poder crearte tus propias etiquetas HTML y poder hace cosas como:
ca-fecha
<input ng-model="fechaNacimiento" ca-fecha>
ca-tabs
y ca-tab
<ca-tabs> <ca-tab nombre="Compras"> Contenido de la segunda pesaña </ca-tab> <ca-tab nombre="Ventas"> Contenido de la segunda pesaña </ca-tab> </ca-tabs>
ca-paginacion
<ca-paginacion numero-paginas="10"></ca-paginacion>
Etc. , etc.
Pasemos ahora a ver alguna característica de las directivas
Lo primero que hemos notado es que hemos usado una directiva como un atributo, como en ca-fecha
pero también se puede hace como si fuera directamente un nuevo tag HTML , como en ca-paginacion
.
AngularJS permite ambas formas e incluso como clases CSS y como comentarios 1), pero es tan raro que mejor ni hablar de ellas. Así que a efectos prácticos una directiva se puede usar como:
<input ng-model="fechaNacimiento" ca-fecha>
<ca-paginacion numero-paginas="10"></ca-paginacion>
El equipo de Angular recomienda que las directivas tengan siempre un prefijo de forma que no choquen con otras directivas creadas por otros desarrolladores o con actuales o futuras etiquetas de HTML. Por eso las directivas de AngularJS empiezan siempre por “ng”. En las directivas que creemos en este curso siempre empezaran por “ca” por “Curso de Angular”.
Ejemplos:
ng-view
: Prefijo ng
para indicar que es una directiva estándar de AngularJSng-repeat
: Prefijo ng
para indicar que es una directiva estándar de AngularJSca-paginacion
: Prefijo ca
para indicar que es una directiva creada en el Curso de AngularJSHasta ahora hemos visto los nombres de las directivas con guiones para separar palabras.
Ej:
ng-repeat
ng-if
ca-paginacion
ca-tabs-vertical
El nombre verdadero de las directivas cuando se definen realmente es el siguiente
Ej:
ng-repeat
→ ngRepeat
ng-if
→ ngIf
ca-paginacion
→ caPaginacion
ca-tabs-vertical
→ caTabsVertical
Es decir el nombre de las directivas sigue el formato de los identificadores en JavaScript. Ese es el nombre que se usa en la documentación de AngularJS cuando se refieren a una directiva y el que usemos cuando creemos una nueva directiva.
Dado el nombre de la directiva tal y como se ve en JavaScript se puede usar en la página HTML siguiendo las siguientes reglas:
data-
o x-
para que los validadores HTML sepan que es una directiva propia nuestra.
Por lo tanto la directiva ngView
puede usarse en una página HTML con las siguientes formas:
ng-view
ng:view
ng_view
data-ng-view
data-ng:view
data-ng_view
x-ng-view
x-ng:view
x-ng_view
Aunque lo normal es restringirse solo a las siguientes formas.
ng-view
data-ng-view
Para crear una directiva debemos definirla dentro de un módulo al igual que hacíamos para los controladores, filtros, etc.
El método a usar del módulo es directive(nombre,funcionFactory)
siendo:
nombre
: El nombre de la directiva siguiendo el forma de los identificadores de JavaScript.funcionFactory
: Es una función que nos retorna un objeto con la definición de la directiva. Como todas las funciones factory puede ser un array para poder inyectarle dependencias.El objeto con la definición de la directiva es el verdadero objeto que contiene toda la información de nuestra directiva y comprender todas sus propiedades implicaría saber todo sobre las directivas así que en esta unidad solo vamos a ver unas cuantas propiedades del objeto con la definición de la directiva.
En esta unidad solo vamos a ver las siguientes propiedades:
En este tema solo vamos a ver las siguientes propiedades:
template
: Es un String con el HTML por el que se substituira la directiva. Si está esta propiedad no puede estar templateUrl
ya que son excluyentes.templateUrl
: Es un String con una URL de un fichero que contiene el HTML por el que se substituira la directiva. Si está esta propiedad no puede estar template
ya que son excluyentes.restrict
: Un String que indica como puede usarse la directiva si como atributo o como elementorestrict
.replace
: Si vale false
el contenido del template se añadirá dentro del tag de la propia directiva. Pero si vale true
se quitará el tag de la directiva y solo estará el contenido del template.
link
y scope
.
Vamos a hacer nuestra primera directiva llamada “acTitulo” que simplemente muestre el texto “Hola Mundo” como título <h1>
.
app.directive("acTitulo",[function() { var directiveDefinitionObject ={ restrict:"E", replace : true, template:"<h1>Hola Mundo</h1>" } return directiveDefinitionObject; }]);
directiveDefinitionObject
que contendrá la definición de la directivareplace
el valor de true
se eliminará de la página el tag de la propia directiva y solo estará el contenido del template.restrict
que el elemento solo puede ser un elemento o tag y no pude estar como atributo de otro elemento o tag.Usaremos la directiva de la siguiente forma:
<ac-titulo></ac-titulo>
Y la directiva generará el siguiente HTML
<h1>Hola Mundo</h1>
Si el valor de replace
hubiera sido false
se hubiera generado el siguiente HTML:
<ac-titulo> <h1>Hola Mundo</h1> </ac-titulo>