Inhoud
1KennismakenmetAngularJS1
WatisAngularJS?2
Librariesenframeworks2
OmschrijvingvanAngularJS3
AngularJSopinternet5
VersiesvanAngularJS6
AngularJSindepagina7
AngularJS-concepten8
Client-sidedHTMLtemplates8
Databinding9
Dependencyinjection10
Directives12
Customdirectives13
Benodigdevoorkennis14
Tipsvoormeerlezen15
Deontwikkelomgevinginrichten15
Editorenbrowser15
Eenwebserver16
Anderetools18
Debugging20
Oefenbestandendownloaden22
Conclusie22
Praktijkoefeningen23
/ix
2BeginnenmetAngularJS27
EenAngularJS-paginasjablooninstellen28
Directiveng-app29
Notatiewijzenvoordirectives30
Helloworld31
ng-model31
Meeroverng-model32
ng-true-valueenng-false-value33
Dedirectiveng-repeat35
Notatievanng-repeat37
Ng-repeatbijobjecten37
Gegevensfilteren39
uppercaseenlowercase39
orderBy40
Omgekeerdsorteren41
Gegevensfilteren42
Filterenopveldnaamvanobject43
Resultaatnietgevonden–ng-if44
Overigefilters45
Conclusie45
Praktijkoefeningen46
3Modulesencontrollers49
Watiseenmodule?50
Modulealssetterenalsgetter52
Dependencies53
Watiseencontroller?55
Dedirectiveng-controller56
Watis$scope?56
Eencontrollerdefiniëren57
Decoderefactoren59
Functiesschrijvenindecontrollerendedirectiveng-click61
Ng-clickbinnenng-repeat62
Meerkenmerkenvancontrollers64
Moduleencontrollerinapartebestanden65
Moduleinapp.js66
Controllerincontroller.js66
Anderesyntaxisomcontrollerstedefiniëren67
Minificationsafesyntaxis68
Benoemdefuncties69
Werkenmet$inject70
/x /Hoofdstuk2/
DecontrollerAs-syntaxis71
Wegmet$scope71
Varvmalsviewmodel71
Conclusie74
Praktijkoefeningen75
4RoutinginAngular-apps79
Kennismakenmetrouting80
SinglepageApplicationofSPA80
Routingalleenviahttp-server82
Routinginstalleren84
Ng-routeenui-router84
Moduleng-routedownloaden84
Dependencyaangeven85
Derouting-directiveng-view85
Werkenmet$routeProvider86
Parametersvoor.when()87
Eenpadconfigureren87
.otherwise()instellen88
Controllersmaken89
Viewsmaken89
InlineHTMLintemplate90
Samenvattingrouting91
Werkenmetrouteparameters91
Hetiddoorgeven92
Case:master/detailviewmetpersoonsgegevens93
Deviewsvoordeapp93
Directiveng-href95
Decontrollersvoordeapp95
Hetbestandapp.js97
Herhalingvanarraymetpersoonsgegevens?97
Conclusie98
Praktijkoefeningen99
5Gegevensvoorzieningmetfactoriesenservices101
Waaromservicesenfactories?102
Doelenvanservicesenfactories102
Singleton103
Dataflowindeapplicatie104
Factoryofservice?105
Eenfactorymaken106
Decontrolleraanpassen108
/xi
Detailgegevensophalenviadefactory109
Deviewaanpassen109
Dedetailviewschrijven109
DedetailControllerschrijven110
Gegevenstoevoegenviadefactory111
Nieuweviewtoevoegen111
Nieuwecontrollerschrijven112
Methode.addPerson()schrijven114
Eenservicemaken115
Methodesrechtstreeksopdefunctieschrijven115
Deserviceinjecteren116
Meerdatacomponenten:valueenconstant117
Hoofdlettergebruik118
Constantengebruikenineencontrollerenview119
Eenvaluegebruiken120 Conclusie122
Praktijkoefeningen123
6Livedataophalenmet$http125
Watdoet$http?126
Algemenewerkingvan$http126
$httpretourneertgeendata128
Json-bestandladenvanserver128
Persons.json129
Userinterfacemaken129
Module,controllerenfactorymaken130
Controllerimplementeren130
Factoryimplementeren131
Foutenafvangen132
Viewuitbreiden132
Controlleruitbreiden132
DemodulengSanitize134
LiveAPI’sopinternetgebruiken135
Dummypersoonsgegevensophalen135
Formaatvoorwerkenmetfilltext.com137
DeHTML-viewvoorpersoonsgegevens137
Decontrollermaken138
Defactorymaken139
/xii /Hoofdstuk2/
Ajax-chainingmet.then()140
OpeenvolgendeAjax-calls141
Structuurvan.then()142
Case:filmgegevensophalenviaOMDbAPI143
DeHTML-code143
Deappinstellen144
Decontrollerinstellen145
DemovieServicemaken146
Gegevenstonen148
Case:gerelateerdefilmsophalen148
HTML-codeuitbreiden149
Constanteaanpassen149
Controlleruitbreiden150
Deserviceuitbreiden151
Verdergaanmet$http,promisesen$q153
Errorhandlingin.then()153
Promisesen$q153
MeerAPI’sommeeteexperimenteren156
RegistrerenvoorAPIkey156
OpenAPI’s156
Conclusie157
Praktijkoefeningen158
7Meerstandaarddirectives161
DirectivesvoorDOM-manipulatie162
ng-showenng-hide163
ng-if 164
CSS-klassenbeherenmetng-class165
ng-hrefenng-src169
Directivesvooreventhandling170
Ng-click170
Deparameter$event171
Ng-mousedown,ng-mouseupenandere172
Ng-keypress173
Ng-paste175
Directivesvoorformulieren176
Ng-submit176
Selectielijstenmaken178
Ng-change179
For-in-notatievoorobjecteninselectielijst179
Ng-focusenng-blur181
Ng-checked182
/xiii
Overigedirectives183
Ng-cloak183
Ng-copy,ng-cutenng-paste185
Ng-disabled185
Conclusie186
Praktijkoefeningen187
8Customdirectivesschrijven189
Beginnenmetcustomdirectives190
Eenklokjemakenindepagina191
NaamgevingvandirectivesinHTMLenJavaScript192
Deklokfunctionaliteitgeven193
HetDirectiveDefinitionObject(DDO)195
OpdrachteninhetDDO195
Isolatedscopecreërenineendirective197
Badpractice198
ScopeisolerenviahetDDO199
Gegevensalsattributendoorgeven200
Controllervandedirectiveaanpassen202
Onafhankelijkemodulemakenvandedirective203
DOM-manipulatiedirectives204
HetDDOuitbreiden205
WerkenmetjqLite206
Waardenvanattributenbenaderen207
Case:eenjQuery-plug-inineenAngularJS-directivegebruiken209
PopovervanTwitterBootstrapenjQuery209
HTML-codeschrijven210
Directive-moduleschrijven210
Defunctielinkvoordedirectiveschrijven211
Dedirectiveinjecteren212
HTML-codeschrijvenomdedirectivetegebruiken212
Conclusie213
Kant-en-klarecustomdirectivesvindenengebruiken214
VerdergaanmetAngularJS215
Conclusie217
Praktijkoefeningen219
/xiv /Hoofdstuk2/
Kennismaken metAngularJS
VanenkeleeenvoudigeHTML-pagina’sinhetbeginvandejarennegentig ishetwebuitgegroeidtoteenvandemeestcomplexesystemendiewe kennen.Internetwordtgebruiktvoorrelatiefeenvoudigehobbysites, maarookvooronlinebetaalsystemen,CRM-enklantbeheersystemen, verzekerings-enschademodellen,socialemediaenontelbareandere zaken.AngularJSbiedteenframeworkvoorhetprogrammerenvan dergelijkeingewikkeldewebapps.Erzijnconcepteninverwerktdiehet mogelijkmakencodeenstructuurvanelkaartescheiden,modulairte programmerenenbovendiengoedtestbareapplicatiestemaken.Dit boekgeefteeninleidingopaldezezaken,zodatunaafloopvolvertrouwenaandeslagkuntmetuweigenAngularJS-applicaties.
Indithoofdstuk:
WatAngularJSis,enwathetnietis.
AngularJS-concepten.
Benodigdevoorkennisensoftware.
KenmerkenvanAngularJS-apps.
1
WatisAngularJS?
HetaloudeHTMLisprimaomgegevensgestructureerdtetonen indebrowser,maarisoorspronkelijknooitontwikkeldvoorhet makenvandynamischewebapplicaties.VoordatdoelisJavaScriptrond1995ontworpenensamenmetCSS(datrond dezelfdetijdopkwam)toegevoegdaandetoolboxvandewebdeveloper.JavaScriptwasinhetbeginlastigtelerenenverschillendebrowsershaddenelkeenverschillendeimplementatievan JavaScript.
Librariesenframeworks
PassindsdeopkomstvanaanvullendebibliothekenalsjQueryin 2006heeftJavaScripteenenormevluchtgenomen.Behalve jQueryzijntalvananderebibliothekenontwikkeld,elkmethun eigendoel.ErzijnlibrariesvoorDOM-manipulatie(zoalsjQuery), routing(sammy.js),databinding(knockout.js)ennogveelmeer.
MaarAngularJSisgeenlibraryzoalsdehiervoorgenoemde. AngularJSiseencompleet framework voorhetrealiserenvan client-sidedwebapplicaties.Alswedezakenergvereenvoudigd voorstellen,kunjezeggendatlibrariesinhetalgemeenéénding heelgoeddoen.EenframeworkzoalsAngularJSbiedtoplossingen vooralleniveausvanapplicatieontwikkeling.Vanhetstructureren enbindenvandata,totAjax-communicatiemetwebservers,het verwerkenvangeretourneerdegegevensineenclient-sideddatamodelenhetmakenvanherbruikbarecomponenten.
Librarieskunneninhetalgemeenwordengecombineerdineen projectomgezamenlijkhetbesteresultaattebereiken.Bijframeworksmaakjedaarentegenéénkeuzeenbouwjedeappvolgens derichtlijnenenkenmerkenvanhetgekozenframework.
/2 /Hoofdstuk1/KennismakenmetAngularJS
Geencombinaties
Wezullenindepraktijkbijvoorbeeldnooitzien dateenapp zowel AngularJSalsDurandal(een alternatiefframework)gebruikt.OokcombinatiesvanAngularJSmetEmber(eenanderalternatief)komennietvoor.Jebouwtdesiteofwel inAngularJS,ofwelinDurandal.Nietinbeide.
OmschrijvingvanAngularJS
HetAngular-frameworkwordtopdeofficiëlesiteomschrevenals:
“AngularJSletsyouwriteclient-sidewebapplicationsasifyouhad asmarterbrowser.Itisastructuralframeworkforcreatingdynamicwebapps.”
MetAngularJSishetrelatiefeenvoudigomcomplexewebapplicatiesteschrijven,omdathetframeworkalshetwareeen abstractielaagbiedttussendebrowser,delogicavandeappen dedatawaarmeewordtgewerkt.Vanoudsherwordtditvaak aangeduidmetdeterm MVC,van Model-View-Controller,maar ditwordtlangzamerhandeenbeetjelosgelaten.Alsutochdeze vergelijkingnogwiltmaken:
• Model Dedatadiedeapplicatiebinnenkomt(meestaluit eendatabase,viaeenAjax-call)heefteenbepaaldestructuur enwordthet‘model’genoemd.
• Controller Delogicaindeapplicatiebewerktdatainhet model.Hetvoegtbijvoorbeeldlosseveldenals firstname en lastname samentoteenveld fullname datindeuserinterface wordtgetoond.Dezelogicastaatineencomponentdie ‘controller’wordtgenoemd.
/3 /AngularJS/
• View DeuserinterfacebestaatuitHTML-templateswaarin de–eventueelbewerkte–gegevenswordengetoond.Het HTML-templateisdaarmeede‘view’vandeapplicatie.Een appkannatuurlijkveleviewshebben.Vanhettonenvande homepagetotmaster-detailviews.
AngularJSisdaarmeeeencompleetclient-sidedMVC-framework. HetisvollediginJavaScriptgeschrevenendraaitookvolledigin debrowser.Idealiterisdeappcompleetlosgekoppeldvandeserverendatabasewaardegegevensvandaankomen.AllecommunicatievindtplaatsviaAjax-calls.Uiteraardgaanwehierlaterin ditboeknogdieperopin.
Geen‘MVC’meer
HetbegripMVComdearchitectuurvoor AngularJSaanteduidenwordtlangzamerhand mindergebruikt.DeterminologievanMVCzou testriktzijnennietgoedpassenbijdeflexibiliteitvanAngularJS.Alsueerderhebtgewerkt metMicrosoft-technologieënalsSilverlightof XAML,kentumisschienhetbegrip MVVM (Model-View-ViewModel).Ookditistevertalen naareenAngularJS-structuur.Anderedesign patternszijnbijvoorbeeld Model-View-Adapter en Model-View-Presenter.Omdieredenwordt AngularJSnuookwelbenoemdalseen MV*-framework(Model-View-Whatever).De begrippencontrollerenviewzullenweechter zekernogtegenkomenbijhetmakenvan AngularJS-apps.
/4 /Hoofdstuk1/KennismakenmetAngularJS
Afbeelding1.1 DehomepagevanAngularJS.Starthiervoorofficiëledownloads,documentatieen meer.
AngularJSopinternet
DehomepagevanAngularJSistevindenop angularjs.org.Hier kuntuhetframeworkdownloaden,onlinetutorialsvolgen,deelnemenaandiscussies,video’sbekijkenvandediverseAngularJSconferentiesenmeer.Ookisdithetstartpuntvoordeofficiële documentatie.Kieshiervoordeoptie Develop, APIReference uit hethoofdmenu,ofvoeg docs.angularjs.org/api directtoeaanuw favorieten.
/5 /AngularJS/
Wiltuhelemaalhardcoregaan,dankuntueeneigenversievan AngularJSbouwenviadeGithub-pagina.Ganaar github.com/ angular/angular.js omdebroncodetedownloaden,tebuildenen eventueelaantepassenvooreigengebruik.Inditboekmakenwe hiervangeengebruik.
VersiesvanAngularJS
AngularJSisrond2009ontstaanalsinternprojectbijGoogle. MiskoHevery(@mheveryopTwitter)isde‘vadervanAngular’. SamenmetprojectmanagerBradGreen(@bradlygreen)bouwde hijAngularJSuittotvolwaardigframeworkdatookdooranderen konwordengebruikt.Rond2011gafGooglehetframeworkonder deMIT-licensievrijalsopensource-software.Indeloopderjaren zijnverschillendeversienummersgebruikt.
• 0.9-1.1 Oktober2010–juni2012.Deeersteversiesdie voorhetalgemenepubliekbeschikbaarwaren.AllefunctionaliteitwasgebundeldinéénAngularJS-module.
• 1.2 November2013.Verbeterdeversiemetondermeeruitsplitsingvandeelfunctionaliteit(routing,animatie)naarlosse modules.
• 1.3 Oktober2014.Tallozebugfixes,performanceverbeteringenenenkelenieuweopties.
• 2.0 Eind2015?Ophetmomentvanschrijvenvanditboek wordtAngularJS2.0ontwikkeld.Hieroverisheftigediscussie gaandeopinternet.Angular2.0wordteencompleetnieuw frameworkengaattalloze breakingchanges bevatten,waardoorhetupgradenvan1.3naar2.0eenvrijwelonmogelijke zaakwordt.AngularJSzalcompleetopES6(devolgendeversie vanJavaScript)zijngebaseerd.
/6 /Hoofdstuk1/KennismakenmetAngularJS
HetisnogonduidelijkhoehetpadnaarAngular2.0verderzalverlopen.Iniedergevalisdatgeenredenomnunietalvastkenniste makenmetdit‘superheroicframework’,zoalsAngularzichzelf enigszinsspottendomschrijft.DeconceptenuitAngular1.3 (modules,directives,views,dependencyinjection)zullengelijk zijn,deimplementatiewordtin2.0echtercompleetanders,zois deverwachting.
Inditboek:AngularJS1.3
InditboekgebruikenweAngularJSversie1.3.3 uitnovember2014.Ditwasophetmomentvan schrijvendemeestrecentestabieleversie.
AngularJSindepagina
HetmakenvaneenAngularJS-applicatieiseenvoudig.Zorgervoor dathetscriptisgedownloadenineenmapvanuwwebsitestaat (wijgebruikendemap\js\vendor\angular).Daarnakuntuhet meteeneenvoudigeJavaScript-referentieinsluitenindepagina:
<scriptsrc="../js/vendor/angular/angular.js"></script>
Wiltuhelemaalniksdownloadenmaarrechtstreeksonlineontwikkelen,dankuntuookverwijzennaarAngularJSophetGoogle CDN.Eeneigenschapisdanuiteraardweldatualleenkuntontwikkelenalsuonlinebent:
<scriptsrc="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.min.js"></script>
Welkemethodeuookgebruikt,nahetinsluitenishetframework indepaginabeschikbaarenkuntuelkeAngular-opdrachtuitvoerendieuinditboektegenkomt.
/7 /AngularJS/
AngularJS-concepten
EriseenaantalkernbegrippenwaaruinelkeAngular-appmeete makenkrijgt.Dezeconceptenzijngeenvanalleuitgevondendoor hetAngular-teamzelf,maargeleenduitdeandereontwikkelomgevingenendaarnameteenJavaScript-implementatietoegepastinhetframework.Indeloopvanhetboekkomenaldeze conceptenuiteraardaandeorde.Hiernoemenwealvastkortde belangrijkste.
Client-sidedHTMLtemplates
HebtuooitinjQuerymoeizaameenHTML-fragmentsamengesteldals $(‘#placeholder’).append(‘<span class="tip"> + data.tiptekst + ‘</span>’) enditdanvaaknogeenstukcomplexer?DanzultudefunctionaliteitvanHTML-templatesin AngularJSkunnenwaarderen.InAngularzijndedataentemplateswaaropdiedatawordentoegepast,vanelkaargescheiden. Detemplateskuntumetelkeeditorzelfschrijven(zoalsweindit boekdoen),ofopdeserverlatensamenstellendoorbijvoorbeeld PHP,ASP.NETMVCofJavaSpringendannaardebrowserzenden. DedatakomttypischviaeenAjax-callbinnenenwordtmetde doublecurlybraces gebondenaandetemplate.
EenvergelijkbarecodealshetjQuery-voorbeeldhiervoorzieter alsAngularHTML-templatebijvoorbeeldalsvolgtuit:
<spanclass="tip">{{data.tipTekst}}</span>
Hierbijis data eenJavaScript-object(hetmodel),dateeneigenschap tipTekst heeft.Ditwordtbinnen {{ … }} gebondenaande HTML-template(deview).Eenmeeruitgebreidetemplatezieter bijvoorbeelduitals:
/8 /Hoofdstuk1/KennismakenmetAngularJS
<pclass="bookDetails">{{book.description}}</p>
<footer>
<pclass="bookTitle">{{book.title}}</p>
<pclass="bookAuthor">{{book.firstAuthorName}}</p>
</footer>
<imgng-src="{{imgSrc}}"alt="paginavan{{book.title}}}“/>
Databinding
IndeHTML-templatewordendedubbeleaccoladesgebruiktom gegevenstebinden.Alleswattussen {{ … }} staat,wordtdoor hetframeworkopgepiktengeëvalueerd.Deuitkomstervan wordtindeuserinterfacegeplaatst.Steldathetobject data uit devorigeparagraafdevolgendeinhoudheeft:
vardata={
tipTekst:‘Klikmetderechtermuisknopvoorextraopties’ }
EndeHTMLzieteruitals:
<spanclass="tip">{{data.tipTekst}}</span>
Danisdeuitvoerindebrowser(watdebezoekerziet):
<spanclass="tip">Klikmetderechtermuisknopvoorextraopties</span>
Hetwordtnatuurlijkextrakrachtigalsdedatabinding-expressies ineenluswordengeplaatst,ofintweerichtingenwerken.Dit wordtinAngular twowaydatabinding genoemd.Hetbetekent datwanneergegevensdoordebezoekerswordeningevuldof gewijzigd(bijvoorbeeldineenHTML-formulier)dezewijzigingen directwordendoorgegeveninhetmodel.UbeschiktinJavaScript dandirectovereenmodelwaarindegegevensaanwezigzijndie debezoekerheeftingevuld.Hetisnietnodig(opnieuwzoalsin jQuery)eersthetgewensteformulierveldteselecterenendaarvandehuidigewaardeuittelezen.Inhetvolgendehoofdstuk maaktutotindetailkennismetdatabinding.
/9 /AngularJS/
Dependencyinjection
InAngularJS-applicatieskanfunctionaliteitwordengebundeldin eenmodule.Dezemodulekanvervolgenswordenhergebruikt (geïnjecteerd)inanderemodules.Ditprincipestaatbekendals dependencyinjection,of DI.
Ditbetekentdatcodeergflexibelwordt.Steldatweeencompleteunithebbengemaaktmettipsvooreenapplicatieenwe willendiezelfdetipsgebruikenineenandereapplicatie.Dankunnenwedetips-moduleinjecterenindenieuwemoduleenhoevenwegeencodetedupliceren.Hetspreektvoorzichdathetin demeestegevallendannietzalgaanomeeneenvoudigobject metstrings,maardatercompletefunctionaliteit,inclusieffunctiesenservercallskunnenwordengebundeld.
Hetsysteemvandependencyinjectionisergkrachtig.Vaakwordenafhankelijkhedenalsparametermeegegevenaaneenfunctie ofmodule.Angularzoektdanzelfdebetreffendemodulesopen voegtzein.Stelbijvoorbeelddatweeencontrollerschrijvendie gebruikwilmakenvandebasisAngularJS-services $http (voor Ajax-calls)en $location (voorwerkenmetdeadresregelinde browser).Danzieteenfunctiedefinitieerbijvoorbeeldalsvolgt uit:
} /10 /Hoofdstuk1/KennismakenmetAngularJS
functiontipController($scope,$http,$location){ //codevoordecontroller...
StandaardAngularJS-services
BijDIkuntuzoweleigenservicesenmodules injecterenalsstandaardAngular-services.De standaardservicesherkentuaanhetdollarteken,zoals $scope, $http en $location.ZewordenstandaardmetAngularJSmeegeleverdenu hoeftzenietapartintevoegen.Hetdollarteken geeftniksspeciaalsaan,hetisgewooneendeel vandenaam.Zozijnzemakkelijkherkenbaar.
/11 /AngularJS/
Afbeelding1.2 StandaardservicesvanAngularJSzijnteherkennenaanhetdollartekenvoorde naam.Indedocumentatiewordenzebeschreven.