SlideShare una empresa de Scribd logo
Directivas	en
AngularJS
@gruizdevilla
@adesis
Meetup	AngularJS	Madrid
Puedes	encontrar	los	ejemplos	de	la	charla	en:
	https://github.com/gonzaloruizdevilla/directivas
¿Qué	es	una	directiva?
Es	un	marcador	sobre	un	elemento	de	DOM,	
como	un	atributo,	un	elemento	o	una	clase	CSS.
Le	indica	al	compilador	de	HTML	de	AngularJS	
($compile)	que	enganche	un	comportamiento	
específico	y/o	transforme	al	elemento	
o	a	sus	descendientes.
jQuery	y	AngularJS	
(sobre	manipulación	de	DOM	en
general)
Solo	hay	UN	SITIO*	donde	es	legítimo	manipular	directamente	el
DOM	(con	jQuery,	zepto,	directamente,	etc.):

LAS	DIRECTIVAS
Si	lo	haces	en	otro	sitio,	lo	estás	haciendo	MAL.

*	Y	tal	vez	un	servicio,	pero	solo	para	los	que	REALMENTE	saben	lo
que	están	haciendo.	Por	ej:	https://github.com/angularui/bootstrap/blob/master/src/modal/modal.js#L109
Un	ejemplo	sencillo:	chispas
Mi	primera	directiva
	
				.directive('chispas',	function	()	{
						return	{
								restrict:	'E',
								link:	function	postLink(scope,	element)	{
											element.text('Mi	primera	directiva:	chispas');
								}
						};
				});
Estilos	de	declaración:	EACM
E:	Elemento
A:	Atributo
C:	Clase	CSS
M:	Comentario
Las	recomendadas	son	EA.	
El	valor	por	defecto	es	A.
La	función	"link"
Donde	registramos	eventos	y	manipulamos	el	DOM.

Se	ejecuta	DESPUÉS	de	haber	clonado	el	DOM	
(una	vez	por	instancia	de	la	directiva)
La	plantilla	se	compila	con	el	scope
que	recibe	la	función	link
	
		.directive('reloj',	function	()	{
				return	{
						template:	'<div>Hora:	{{hora	|	date:	'h:mm:ss	a'}}</div>',
						restrict:	'E',
						link:	function	postLink(scope)	{
								scope.hora	=	new	Date();
						}
				};
		});
Hay	que	mantener	AngularJS	al
corriente	de	los	cambios	de	scope
Mediante	$apply,	$digest	o	en	el	contexto	de	una	ejecución	de
AngularJS
		.directive('reloj2',	function	()	{
				return	{
						template:	'<div>Hora:	{{hora	|	date:	'h:mm:ss	a'}}	<button>Actualizar</button>
</div>',
						restrict:	'E',
						link:	function	postLink(scope,	element)	{
								scope.hora	=	new	Date();
								element.find('button').click(function	(){
										scope.$apply(function()	{
												scope.hora	=	new	Date();
										});
								});
						}
				};
		});
Mediante	la	propiedad	templateUrl
separamos	html	y	JavaScript
	
		.directive('reloj3',	function	()	{
				return	{
						templateUrl:	'templates/reloj3.html',
						restrict:	'E',
						link:	function	postLink(scope,	element)	{
								scope.hora	=	new	Date();
								element.find('button').click(function	(){
										scope.$apply(function()	{
												scope.hora	=	new	Date();
										});
								});
						}
				};
		});
Controladores:	para	no	reinventar	la
rueda
Podemos	extraer	parte	de	la	lógica	a	un	controlador	tradicional	de
AngularJS

		.controller('RuedaCtrl',	function	($scope)	{
				$scope.rotating	=	false;
				$scope.toggle	=	function	()	{
						$scope.rotating	=	!$scope.rotating;
				};
		})
		.directive('rueda',	function	()	{
				return	{
						templateUrl:	'templates/rueda.html',
						controller:	'RuedaCtrl',
						restrict:	'E',
						link:	function	postLink()	{}
				};
		});
Comunicándose	con	el	exterior
La	directiva	puede	comunicar	con	el	exterior:
1.	 A	través	del	scope
2.	 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
Puede	ser	legítimo	leer	del	scope	del	padre,	pero	manipular	los
objetos	que	hay	en	el	es	otro	tema,	pues	podríamos	violar	el
Principio	de	la	Mínima	Sorpresa.
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.
Interacción	de	formularios:	
ngModel.ngModelController
Las	ventajas	de	ngModel:
$setViewValue:	para	informar	de	un	nuevo	valor,	reaccionando
a	un	evento	DOM,	por	ejemplo
$formatters	y	$parsers:	adaptan	un	valor	que	viaja	
del	scope	a	la	vista	y	viceversa,	validándolo	si	es	necesario.
$setValidity:	permite	enganchar	con	el	sistema
común	de	validaciones	del	formulario
Compile	vs	link
Compile:	trabaja	sobre	el	DOM	original,	que	se	clonará
para	usar	en	link,	antes	de	procesar	las	buscar
Link:	combina	las	directivas	con	un	scope	y	produce	una	vista
viva.	Los	cambios	en	el	scope	se	reflejan	en	la	vista
	y	las	interacciones	en	la	vista	se	reflejan	en	el	modelo.
	

El	uso	de	compile	es	raramente	necesario.
Directivas	y	Webcomponents
(PolymerJS)
Hay	cierto	solape	entre	ellos
Parte	de	Polymer	acabará	entrando	en	AngularJS	2	
(como	por	ejemplo	el	shim	ShadowDOM).

Es	difícil	predecir	hacia	donde	evolucionarán,	
pero	será	apasionante.
¡Gracias!
¿Preguntas?

Más contenido relacionado

PPTX
Advanced angular 1
PPTX
Angular Conceptos Practicos 1
PDF
Angular js
PDF
Despegar Tech Talk - AngularJS
PDF
Angular js in mobile
PPTX
Curso AngularJS - 7. temas avanzados
PDF
Angular js
PPTX
Curso AngularJS - 3. módulos y controladores
Advanced angular 1
Angular Conceptos Practicos 1
Angular js
Despegar Tech Talk - AngularJS
Angular js in mobile
Curso AngularJS - 7. temas avanzados
Angular js
Curso AngularJS - 3. módulos y controladores

La actualidad más candente (18)

PDF
Manual de jquery en pdf desarrollowebcom
PPTX
Javascript + Angular Sesion 5
PPTX
La magia de jquery
PPTX
4 Programación Web con .NET y C#
PDF
Angular.js
PPTX
ASP.Net MVC 3 - Eugenio Serrano
DOCX
Elementos de jsp
PDF
Presentacion diseño web con jquery
PPT
Patrones j2 ee
PDF
(Muy breve) Introduccion a jQuery
PDF
Ruby On Rails Intro
PDF
Introduccion silverlight
DOC
Introducción JavaScript
ODP
El Mal Odiado Javascript
PDF
Filtrado de recursos en Maven
PDF
Introducción a prototype javascript
PPTX
Cross development - React para desarrolladores de asp.net
KEY
Creación de plugins con Grails
Manual de jquery en pdf desarrollowebcom
Javascript + Angular Sesion 5
La magia de jquery
4 Programación Web con .NET y C#
Angular.js
ASP.Net MVC 3 - Eugenio Serrano
Elementos de jsp
Presentacion diseño web con jquery
Patrones j2 ee
(Muy breve) Introduccion a jQuery
Ruby On Rails Intro
Introduccion silverlight
Introducción JavaScript
El Mal Odiado Javascript
Filtrado de recursos en Maven
Introducción a prototype javascript
Cross development - React para desarrolladores de asp.net
Creación de plugins con Grails
Publicidad

Destacado (12)

PDF
Creación de directivas personalizadas en AngularJS
PPTX
08 desarrollo de aplicaciones web con angular js dom
PDF
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
ODP
AngularJS Patterns: Clean Code
PPTX
14 desarrollo de aplicaciones web con angular js animaciones
PPTX
Introducción a AngularJS
PPTX
Directivas en angular js
PPTX
Curso AngularJS - 6. formularios
PPTX
Introducción a Knockout
PDF
Tutorial AngularJS - episódio 5 - diretivas
PPTX
Introducción a AngularJS
PPT
Angularjs Lógica de negocio
Creación de directivas personalizadas en AngularJS
08 desarrollo de aplicaciones web con angular js dom
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
AngularJS Patterns: Clean Code
14 desarrollo de aplicaciones web con angular js animaciones
Introducción a AngularJS
Directivas en angular js
Curso AngularJS - 6. formularios
Introducción a Knockout
Tutorial AngularJS - episódio 5 - diretivas
Introducción a AngularJS
Angularjs Lógica de negocio
Publicidad

Similar a Directivas en AngularJS (20)

ODP
Introducción a JQuery
PPTX
Javascript y Jquery.pptx
PPTX
Clase 12 jQuery basico
PDF
ODP
Presentacion Ruby on Rails en Universidad Autónoma 2009
PPTX
Desarrollo de Aplicaciones N° 01 - 02 - reactjs(2).pptx
ODP
Mudate a ajax sin morir en el intento.
PDF
El combate del siglo: AngularJS vs ReactJS
DOCX
PPTX
Introduccion a j query
PPTX
Conociendo ReactJs . Scio Talks
PPTX
Html5, css3, java script
PPTX
AngularJS2
PPTX
Primer presentacion
KEY
Rails intro
PDF
Extender Jquery para crear componentes web personalizados
PDF
Javascript en proyectos reales: jQuery
PPTX
Taller de Jquery
Introducción a JQuery
Javascript y Jquery.pptx
Clase 12 jQuery basico
Presentacion Ruby on Rails en Universidad Autónoma 2009
Desarrollo de Aplicaciones N° 01 - 02 - reactjs(2).pptx
Mudate a ajax sin morir en el intento.
El combate del siglo: AngularJS vs ReactJS
Introduccion a j query
Conociendo ReactJs . Scio Talks
Html5, css3, java script
AngularJS2
Primer presentacion
Rails intro
Extender Jquery para crear componentes web personalizados
Javascript en proyectos reales: jQuery
Taller de Jquery

Último (20)

PDF
Ronmy José Cañas Zambrano - Potenciando la tecnología en Venezuela.pdf
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Diapositiva proyecto de vida, materia catedra
PPTX
la-historia-de-la-medicina Edna Silva.pptx
PDF
capacitación de aire acondicionado Bgh r 410
PPTX
Propuesta BKP servidores con Acronis1.pptx
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
PDF
MANUAL de recursos humanos para ODOO.pdf
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PDF
CyberOps Associate - Cisco Networking Academy
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
clase auditoria informatica 2025.........
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PPTX
Presentacion de Alba Curso Auditores Internos ISO 19011
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
PRESENTACIÓN GENERAL MIPIG - MODELO INTEGRADO DE PLANEACIÓN
PDF
informe_fichas1y2_corregido.docx (2) (1).pdf
PPTX
Historia Inteligencia Artificial Ana Romero.pptx
PPTX
Sesion 1 de microsoft power point - Clase 1
Ronmy José Cañas Zambrano - Potenciando la tecnología en Venezuela.pdf
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Diapositiva proyecto de vida, materia catedra
la-historia-de-la-medicina Edna Silva.pptx
capacitación de aire acondicionado Bgh r 410
Propuesta BKP servidores con Acronis1.pptx
historia_web de la creacion de un navegador_presentacion.pptx
El-Gobierno-Electrónico-En-El-Estado-Bolivia
MANUAL de recursos humanos para ODOO.pdf
Power Point Nicolás Carrasco (disertación Roblox).pptx
CyberOps Associate - Cisco Networking Academy
Zarate Quispe Alex aldayir aplicaciones de internet .docx
clase auditoria informatica 2025.........
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Presentacion de Alba Curso Auditores Internos ISO 19011
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PRESENTACIÓN GENERAL MIPIG - MODELO INTEGRADO DE PLANEACIÓN
informe_fichas1y2_corregido.docx (2) (1).pdf
Historia Inteligencia Artificial Ana Romero.pptx
Sesion 1 de microsoft power point - Clase 1

Directivas en AngularJS