SlideShare a Scribd company logo
1 of 22
Download to read offline
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?

More Related Content

What's hot

Manual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomManual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcom
jo_ram
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jquery
Eutobar
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
El Jota
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascript
aitorgr
 

What's hot (18)

Manual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomManual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcom
 
Javascript + Angular Sesion 5
Javascript + Angular Sesion 5Javascript + Angular Sesion 5
Javascript + Angular Sesion 5
 
La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jquery
 
4 Programación Web con .NET y C#
4 Programación Web con .NET y C#4 Programación Web con .NET y C#
4 Programación Web con .NET y C#
 
Angular.js
Angular.jsAngular.js
Angular.js
 
ASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio SerranoASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio Serrano
 
Elementos de jsp
Elementos de jspElementos de jsp
Elementos de jsp
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jquery
 
Patrones j2 ee
Patrones j2 eePatrones j2 ee
Patrones j2 ee
 
(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails Intro
 
Introduccion silverlight
Introduccion silverlightIntroduccion silverlight
Introduccion silverlight
 
Introducción JavaScript
Introducción JavaScriptIntroducción JavaScript
Introducción JavaScript
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
Filtrado de recursos en Maven
Filtrado de recursos en MavenFiltrado de recursos en Maven
Filtrado de recursos en Maven
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascript
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
Creación de plugins con Grails
Creación de plugins con GrailsCreación de plugins con Grails
Creación de plugins con Grails
 

Viewers also liked

Viewers also liked (12)

Creación de directivas personalizadas en AngularJS
Creación de directivas personalizadas en AngularJSCreación de directivas personalizadas en AngularJS
Creación de directivas personalizadas en AngularJS
 
08 desarrollo de aplicaciones web con angular js dom
08 desarrollo de aplicaciones web con angular js   dom08 desarrollo de aplicaciones web con angular js   dom
08 desarrollo de aplicaciones web con angular js dom
 
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
 
AngularJS Patterns: Clean Code
AngularJS Patterns: Clean CodeAngularJS Patterns: Clean Code
AngularJS Patterns: Clean Code
 
14 desarrollo de aplicaciones web con angular js animaciones
14 desarrollo de aplicaciones web con angular js   animaciones14 desarrollo de aplicaciones web con angular js   animaciones
14 desarrollo de aplicaciones web con angular js animaciones
 
Introducción a AngularJS
Introducción a AngularJSIntroducción a AngularJS
Introducción a AngularJS
 
Directivas en angular js
Directivas en angular jsDirectivas en angular js
Directivas en angular js
 
Curso AngularJS - 6. formularios
Curso AngularJS - 6. formulariosCurso AngularJS - 6. formularios
Curso AngularJS - 6. formularios
 
Introducción a Knockout
Introducción a KnockoutIntroducción a Knockout
Introducción a Knockout
 
Tutorial AngularJS - episódio 5 - diretivas
Tutorial AngularJS - episódio 5 -  diretivasTutorial AngularJS - episódio 5 -  diretivas
Tutorial AngularJS - episódio 5 - diretivas
 
Introducción a AngularJS
Introducción a AngularJSIntroducción a AngularJS
Introducción a AngularJS
 
Angularjs Lógica de negocio
Angularjs Lógica de negocioAngularjs Lógica de negocio
Angularjs Lógica de negocio
 

Similar to Directivas en AngularJS

Similar to Directivas en AngularJS (20)

Introducción a JQuery
Introducción a JQueryIntroducción a JQuery
Introducción a JQuery
 
Javascript y Jquery.pptx
Javascript y Jquery.pptxJavascript y Jquery.pptx
Javascript y Jquery.pptx
 
J query
J queryJ query
J query
 
Clase 12 jQuery basico
Clase 12  jQuery basicoClase 12  jQuery basico
Clase 12 jQuery basico
 
Jquery
JqueryJquery
Jquery
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009
 
Mudate a ajax sin morir en el intento.
Mudate a ajax sin morir en el intento.Mudate a ajax sin morir en el intento.
Mudate a ajax sin morir en el intento.
 
El combate del siglo: AngularJS vs ReactJS
El combate del siglo: AngularJS vs ReactJSEl combate del siglo: AngularJS vs ReactJS
El combate del siglo: AngularJS vs ReactJS
 
Guiajs2
Guiajs2Guiajs2
Guiajs2
 
Introduccion a j query
Introduccion a j queryIntroduccion a j query
Introduccion a j query
 
Conociendo ReactJs . Scio Talks
Conociendo ReactJs . Scio TalksConociendo ReactJs . Scio Talks
Conociendo ReactJs . Scio Talks
 
Html5, css3, java script
Html5, css3, java scriptHtml5, css3, java script
Html5, css3, java script
 
AngularJS2
AngularJS2AngularJS2
AngularJS2
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Primer presentacion
Primer presentacion Primer presentacion
Primer presentacion
 
Rails intro
Rails introRails intro
Rails intro
 
Extender Jquery para crear componentes web personalizados
Extender Jquery  para crear componentes web personalizadosExtender Jquery  para crear componentes web personalizados
Extender Jquery para crear componentes web personalizados
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 
Taller de Jquery
Taller de JqueryTaller de Jquery
Taller de Jquery
 
Kit polymer en Medianet Software
Kit polymer en Medianet SoftwareKit polymer en Medianet Software
Kit polymer en Medianet Software
 

Recently uploaded

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Recently uploaded (11)

How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 

Directivas en AngularJS