36
AngularJS direttive, testing e organizzazione @AndreaVallotti

CommitUniversity AngularJSAdvanced Andrea Vallotti

Embed Size (px)

DESCRIPTION

Andrea Vallotti presenta il workshop di CommitUniversity in AngularJS Advanced. 17 Luglio- Cinema di Sesto Fiorentino

Citation preview

Page 1: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

direttive, testing e

organizzazione

@AndreaVallotti

Page 2: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Alcune indicazioni…

Potete scaricare i sorgenti da:

http://localhost/AdvancedAngularBackend/ClientStandalon

e.zip

Potete collegarvi ai servizi usando:

applicationUrls.baseUrl =

'http://localhost/AdvancedAngularBackend/'

Page 3: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Riepilogo

● AngularJS

● Direttive

● Testing (Unit)

● Gestione delle dipendenze

● Mettiamo tutto insieme

● Q&A

Page 4: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

AngularJS

● AngularJS

● Direttive

● Testing (Unit)

● Gestione delle dipendenze

● Mettiamo tutto insieme

● Q&A

Page 5: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

AngularJS - Generale

E’ un framework JavaScript:

● per lo sviluppo di applicazioni Web in modalità Single

Page Application

● “forza” l’uso del pattern MVC

● implementa il two-way data-binding

● pensato per facilitare il test:o separazione delle competenze

o dependency injection

o mock del back end

Page 6: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

AngularJS - Anatomia

<body ng-app=”ngCommitUniversity”>

...

<div ng-controller="homeController">

...

<div cmsw-spinner="loadingTracker.active()"

class="fixedHeight"

spinner-options="{direction: -1, length: 50}">

...

<span ng-show="username"

ng-bind="'Ciao ' + username + '!'"></span>

</div>

Page 7: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive

● AngularJS

● Direttive

● Testing (Unit)

● Gestione delle dipendenze

● Mettiamo tutto insieme

● Q&A

Page 8: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - Definizione

//directives = angular.module('…', [ … ]);

directives.directive('cmswSpinner', function () {

return {

// descrittore della direttiva

};

});

//<div cmsw-spinner …

Forme possibili: data-cmsw-spinner, x-cmsw-spinner, cmsw-spinner,

cmsw_spinner, cmsw:spinner

Page 9: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - Definizione

● restrict - definisce le modalità di utilizzo

ammesse (e.g. restrict: ‘EA’)● template - inline HTML template

● templateUrl - url per scaricare il template

della direttiva tramite richiesta ajax● replace - definisce se sostituire o

appendere il template all’elemento originale

Page 10: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - Definizione

● priority - definisce l’ordine di

“esecuzione” delle direttive● terminal - indica se il processo di

compilazione deve terminare alla direttiva

corrente● require - specifica se è necessario

utilizzare altre direttive: [?][^]directive

Page 11: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - ciclo di vita

1. costruzione

2. compilazione del template

3. *creazione dello scope e del controller

4. *pre-linking

5. ricorsione sui figli

6. post-linking

Page 12: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - scope

scope: false | true | { … }

● false - è il default, la direttiva condivide lo

scope del controllore che la contiene● true - viene creato uno scope per la

direttiva che “deriva” dallo scope contenitore

● { … } - viene creato uno scope isolato

Page 13: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

● fondamentali per: separazione e riusabilità

● permettono di definire dei collegamenti con il

mondo esterno:o @[attr] - collegamento monodirezionale con il

valore di un attributo del DOMo =[?][attr] - collegamento bidirezionale

o &[attr] - esecuzione di un espressione nello

scope contenitore

Direttive - scope isolati

Page 14: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - controller

● si dichiarano come i controller “normali”

● iniettabile con:o qualunque servizio disponibile nell’applicazione

o servizi specifici: $scope, $element, $attrs,

$transclude

● logica e varibili “locali”

● no manipolazione del DOM

● opzionale

Page 15: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - link

link: function (scope, iElement, iAttrs,

[controller], [transcludeFn]) { ... }

oppure:link: {

pre: function ( … ) { ... }

post: function ( … ) { ... }

}

Page 16: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - link

● è la funzione principale

● nel 80% dei casi non serve altro

● manipolazione del DOM

● registrazione agli eventi del DOM:o è fondamentale utilizzare $scope.$apply per

propagare le modifiche

● registrazione dei watch

Page 17: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - transclude

transclude: true,

template: '<div><div …></div><div

ng-transclude></div></div>'

<div ng-controller="homeController">

<div cmsw-spinner="…" …>

<button …>Carica</button>

<span …></span>

</div>

</div>

<div ng-controller="homeController">

<div cmsw-spinner="…" …>

<div …>

</div>

<div>

<button …>Carica</button>

<span …></span>

</div>

</div>

</div>

Page 18: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - transcludeFn

function([scope], cloneLinkingFn)

● scope - è opzionale, di default viene usato

quello della direttiva● cloneLinkingFn - è una callback a cui

viene passato l’elemento clonato e collegato

la quale serve per inserirlo nel DOM

Page 19: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - compilazione

compile: function(tElement, tAttrs) { ... }

● modifica il DOM del template

● non ha accesso allo scope

● è invocata per ogni direttiva

● *ritorna una funzione/oggetto di link

● migliora le performance

Page 20: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - comunicazione

● Direttiva → Controller:o scope isolato con binding &

● Controller → Direttiva:o scope isolato con binding mono o bidirezionale

● Direttiva ←→ Direttiva:o attraverso i controller

Page 21: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Direttive - Q&A

Domande?

(Sperando di sapervi rispondere :-D)

5 min

Page 22: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Testing

● AngularJS

● Direttive

● Testing (Unit)

● Gestione delle dipendenze

● Mettiamo tutto insieme

● Q&A

Page 23: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Testing - Jasmine

● Stile BDD

● Autonomo

● JavaScript puro

● Test runner:o una semplice pagina HTML;

o Karma per Node.js;

o Chutzpah per Visual Studio;

Page 24: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Testing - Jasmine - anatomia

describe('Test', function() {

var testFixture;

beforeEach(function() { … });

afterEach(function() { … });

it('should fail', function() {

expect(true).toBe(false);

});

});

Page 25: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Testing - Jasmine - spies

● Mock (FakeItEasy, mockito, etc.)

● Comportamento:o invocazione metodo originale

o invocazione metodo fake

o lancio eccezioni

● Asserzioni sull’invocazione dei metodi:o argomenti

o ordine

Page 26: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Testing - angular.mock

● module(…) - registrare moduli per l’injector

● inject(…) - inietta le variabili richieste

● $httpBackend - simula la comunicazione

HTTP con il back end e di definire delle

attese:o when???(…).response(…)

o expect???(…)[.response(…)]

o flush([count])

Page 27: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Testing - controller

● Caricare il modulo

● Farsi iniettare le dipendenze

● Creare uno scope

● Creare i mock necessari

● Creare il controller

● Utilizzare il metodo $apply dello scope

Page 28: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Testing - direttive

● Caricare il modulo

● Preparare l’HTML di test (stringa)

● Farsi iniettare $compile e $rootScope

● Compilare l’HTML

● Modificare scope → verificare il DOM

● Modificare il DOM e lanciare gli eventi →

verificare lo scope

Page 29: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Gestione delle dipendenze

● AngularJS

● Direttive

● Testing (Unit)

● Gestione delle dipendenze

● Mettiamo tutto insieme

● Q&A

Page 30: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Dipendenze - AngularJS’s way

Modulo - raggruppamento di “oggetti Angular”

angular.module('???', […])

.config(function(…){…})

.run(function(…){…})

var m = angular.module('???')

Angular non si occupa di caricare gli script!

Page 31: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Dipendenze - RequireJS

● Definisce le dipendenze fra file/moduli

● Carica file/moduli

● Garantisce l’ordine di caricamento

● Asincrono

● Usabile con librerie non-RequireJS

● Elimina variabili globali

● Include un tool per minimizzare e offuscare il

codice (r.js)

Page 32: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Dipendenze - RequireJS

require.config({

baseUrl: '…',

paths: {

'nome': 'path/fuori/da/baseUrl', …

},

shim: {

'nome': { deps: […], exports: '…' }, …

}

});

require([…], function(){ });

//<script data-main="main.js" src="app/vendor/require.js">

main.js

Page 33: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Dipendenze - RequireJS

● Definire nelle sezioni path e shim, la

posizione e le dipendeze delle librerie

angular

● Bootstrap manuale:o No ng-app

o utilizzare plugin domReadyo utilizzare angular.bootstrap(…)

● Definire due main.js per test ed “esecuzione”

Page 34: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Ricordate!!!

Page 35: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Riferimenti

● AngularJS - https://angularjs.org/

● Jasmine -

http://jasmine.github.io/2.0/introduction.html

● RequireJS - http://requirejs.org/

● Build custom directives with AngularJS -

http://www.ng-

newsletter.com/posts/directives.html

Page 36: CommitUniversity  AngularJSAdvanced Andrea Vallotti

AngularJS

Advanced

17

.0

7.2

01

4

Q&A

Domande?

(Sperando di sapervi rispondere :-D)

15 min