directivas en angularjs

22
Directivas en AngularJS @gruizdevilla @adesis Meetup AngularJS Madrid Puedes encontrar los ejemplos de la charla en: https://github.com/gonzaloruizdevilla/directivas

Upload: gonzalo-ruiz-de-villa

Post on 12-Jun-2015

1.887 views

Category:

Technology


1 download

DESCRIPTION

Introducción a las directivas de AngularJS. Presentación del grupo de AngularjS Madrid en febrero de 2014.

TRANSCRIPT

Page 1: Directivas en AngularJS

DirectivasenAngularJS

@gruizdevilla@adesis

MeetupAngularJSMadridPuedesencontrarlosejemplosdelacharlaen:https://github.com/gonzaloruizdevilla/directivas

Page 2: Directivas en AngularJS

¿Quéesunadirectiva?

EsunmarcadorsobreunelementodeDOM,comounatributo,unelementoounaclaseCSS.LeindicaalcompiladordeHTMLdeAngularJS($compile)queengancheuncomportamientoespecíficoy/otransformealelementooasusdescendientes.

Page 3: Directivas en AngularJS

jQueryyAngularJS(sobremanipulacióndeDOMen

general)

SolohayUNSITIO*dondeeslegítimomanipulardirectamenteelDOM(conjQuery,zepto,directamente,etc.):

LASDIRECTIVASSilohacesenotrositio,loestáshaciendoMAL.

*Ytalvezunservicio,perosoloparalosqueREALMENTEsabenloqueestánhaciendo.Porej:https://github.com/angular-ui/bootstrap/blob/master/src/modal/modal.js#L109

Page 4: Directivas en AngularJS

Unejemplosencillo:chispas

Miprimeradirectiva.directive('chispas',function(){return{restrict:'E',link:functionpostLink(scope,element){element.text('Miprimeradirectiva:chispas');}};});

Page 5: Directivas en AngularJS

Estilosdedeclaración:EACM

E:ElementoA:AtributoC:ClaseCSSM:Comentario

LasrecomendadassonEA.ElvalorpordefectoesA.

Page 6: Directivas en AngularJS

Lafunción"link"

DonderegistramoseventosymanipulamoselDOM.

SeejecutaDESPUÉSdehaberclonadoelDOM(unavezporinstanciadeladirectiva)

Page 7: Directivas en AngularJS

Laplantillasecompilaconelscopequerecibelafunciónlink

.directive('reloj',function(){return{template:'<div>Hora:{{hora|date:\'h:mm:ssa\'}}</div>',restrict:'E',link:functionpostLink(scope){scope.hora=newDate();}};});

Page 8: Directivas en AngularJS

HayquemantenerAngularJSalcorrientedeloscambiosdescopeMediante$apply,$digestoenelcontextodeunaejecuciónde

AngularJS

.directive('reloj2',function(){return{template:'<div>Hora:{{hora|date:\'h:mm:ssa\'}}<button>Actualizar</button></div>',restrict:'E',link:functionpostLink(scope,element){scope.hora=newDate();element.find('button').click(function(){scope.$apply(function(){scope.hora=newDate();});});}};});

Page 9: Directivas en AngularJS

MediantelapropiedadtemplateUrlseparamoshtmlyJavaScript

.directive('reloj3',function(){return{templateUrl:'templates/reloj3.html',restrict:'E',link:functionpostLink(scope,element){scope.hora=newDate();element.find('button').click(function(){scope.$apply(function(){scope.hora=newDate();});});}};});

Page 10: Directivas en AngularJS

Controladores:paranoreinventarlarueda

PodemosextraerpartedelalógicaauncontroladortradicionaldeAngularJS

.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:functionpostLink(){}};});

Page 11: Directivas en AngularJS

Comunicándoseconelexterior

Ladirectivapuedecomunicarconelexterior:

1. Atravésdelscope2. Medianteatributos

Lasegundaopciónsuelesermejor,aunquesiemprehayexcepciones.

Page 12: Directivas en AngularJS

UsandoelScope

Comoocurreenloscontroladores,elscopesecopiapordefecto:

lostiposbásicosporvalorlosobjetosporreferencia

Puedeserlegítimoleerdelscopedelpadre,peromanipularlosobjetosquehayenelesotrotema,puespodríamosviolarel

PrincipiodelaMínimaSorpresa.

Page 13: Directivas en AngularJS

Usandoatributos.

Eslamejormanera.Convieneempezaraislándosedelscopepadre

.directive('miDirectiva',function(){return{//...scope:{},//...}})

Aldefinirunscope:{},ladirectivatendráunscopelimpio,quenoheredarálaspropiedadesdelscopedelcontenedor.

Page 14: Directivas en AngularJS

Tresformasdecomunicación:

.directive('miDirectiva',function(){return{//...scope:{"a":"@","b1":"@b2","c":"=","d1":"=d2","e":"&","f1":"&f2"},//...},})

Page 15: Directivas en AngularJS

Laprimeraforma:@o@attr

Pista:arrobaes"at",comodeatributo.Serecibeelvalordelatributo,esdecir,siesdelaforma:

<midirectivamiatributo='algoPasaCon{{nombre}}'/>

yenelcontenedor

$scope.nombre='Mary'

entoncesenladirectiva,elscopelocaltendrá

scope.miatributo='algoPasaConMary'

Page 16: Directivas en AngularJS

Lasegundaforma:=o=attr

Pista:igual.Elscopelocalconelpadre.

Creaunbindbidireccionalentrelapropiedaddelscopelocalylaquesehayareferenciadoenelpadre.

<midirectivamiatributo='propiedadP'/>

yenelcontenedor

$scope.propiedadP='Yosoytupadre'

entoncesenladirectiva,elscopelocaltendrá

scope.miatributo=='Yosoytupadre'//elvalordepropiedadPenelscopedelpadre,siempreactualizado

Page 17: Directivas en AngularJS

Laterceraforma:&o&attr

Pista:&escomounpunteroenC.Devuelveunafunción.

Devuelveunafunciónqueejecutarálaexpresióndelatributocontraelscopedelpadre.Elscopesepuede

extenderenelmomentodelaejecuciónconvaloresadicionales.

Unejemplohabitualesng-click.

Page 18: Directivas en AngularJS

"Transclusion",elpalabromásraro(Loquevieneaser<content>enwebcomponents).

Hayqueactivarlatransclusión:

.directive('midirectiva',function(){return{//...transclude:true,//..};});

Yluegousar:

ng-transclude

EstadirectivamarcaelpuntodeinsercióndelDOMdeladirectivapadremáscercanaquetengaactivadalatransclusión.

Page 19: Directivas en AngularJS

Interaccióndeformularios:ngModel.ngModelController

LasventajasdengModel:

$setViewValue:parainformardeunnuevovalor,reaccionandoauneventoDOM,porejemplo$formattersy$parsers:adaptanunvalorqueviajadelscopealavistayviceversa,validándolosiesnecesario.$setValidity:permiteengancharconelsistemacomúndevalidacionesdelformulario

Page 20: Directivas en AngularJS

Compilevslink

Compile:trabajasobreelDOMoriginal,queseclonaráparausarenlink,antesdeprocesarlasbuscarLink:combinalasdirectivasconunscopeyproduceunavistaviva.Loscambiosenelscopesereflejanenlavistaylasinteraccionesenlavistasereflejanenelmodelo.

Elusodecompileesraramentenecesario.

Page 21: Directivas en AngularJS

DirectivasyWebcomponents(PolymerJS)

HayciertosolapeentreellosPartedePolymeracabaráentrandoenAngularJS2(comoporejemploelshimShadowDOM).

Esdifícilpredecirhaciadondeevolucionarán,peroseráapasionante.

Page 22: Directivas en AngularJS

¡Gracias!

¿Preguntas?