SlideShare a Scribd company logo
1 of 32
Download to read offline
Angular 4
Services
in collaborazione conServices 2
È una classe Angular utilizzata per implementare funzionalità
indipendenti da una view specifica, o per fornire dati e logica
condivisi per più componenti.
I services vengono iniettati in altri componenti o servizi tramite
dependency injection.
in collaborazione conServices 3
La dependecy injection è un design pattern e un meccanismo
per la creazione e la distribuzione di parti di una applicazione
all'interno di altre parti che le richiedono.
in collaborazione conServices 4
Un componente potrebbe avere la necessità di utilizzare un
service per ottenere dei dati o per utilizzare delle funzioni.
Se un componente "A" si affida ad un altra entità "B", si dice
che "A" dipende da "B" e che "B" è una dipendenza di "A".
1.
CREARE UN SERVICE
in collaborazione conServices 5
in collaborazione conServices
Solitamente, i services sono parti
di logica o dati che vengono
condivisi in più componenti.
È logico inserirli in una cartella
shared.
Non sempre, un service è
condiviso per l'intera
applicazione.
6
-src
--app
---shared
----...
in collaborazione conServices
Il nome del file deve rispecchiare
il seguente pattern:
service-name.service.ts
7
-src
--app
---shared
----logging.service.ts
in collaborazione conServices 8
/* src/app/shared/logging.service.ts */
export class LoggingService {
}
in collaborazione conServices
providers
Il service, per poter essere
utilizzato, va prima definito
nell'array providers, all'interno
del decorator @Component
9
/* src/app/app.component.ts */
import { Component } from '@angular/
core';
import { LoggingService } from '../
shared/logging.service';
@Component({
providers:[LoggingService],
...
})
export class AppComponent {
}
in collaborazione conServices
Il service va poi iniettato, tramite
dependency injection, nel
componente tramite il suo
costruttore
10
/* src/app/app.component.ts */
import { Component } from '@angular/
core';
import { LoggingService } from '../
shared/logging.service';
@Component({
...
})
export class AppComponent {
constructor(private ls:
LoggingService) {}
}
in collaborazione conServices 11
La dependency injection in Angular è di tipo gerarchica: i figli del
componente nel quale viene iniettato il service riceveranno
automaticamente le funzionalità del servizio stesso.
in collaborazione conServices
Se ChildComponent è figlio di
AppComponent (dove è stato
iniettato il servizio) allora non è
necessario includerlo nell'array
providers
12
/* src/app/app.component.ts */
import { Component } from '@angular/
core';
import { LoggingService } from '../
shared/logging.service';
@Component({
...
})
export class ChildComponent {
constructor(private ls:
LoggingService) {}
}
in collaborazione conServices 13
AppComponent
Child1Component Child2Component
ChildChild1Component
LoggingService
OtherService
AppModule
GlobalService
2.
DECORATOR
in collaborazione conServices 14
in collaborazione conServices
@Injectable()
Il service, grazie ad @Injectable,
può ricevere, tramite dependency
injection, un altro service.
15
/* src/app/shared/logging.service.ts
*/
import { Injectable } from '@angular/
core';
import { OtherService } from '../
shared/other.service';
@Injecatable()
export class LoggingService {
constructor(private os:
OtherService) {}
}
3.
OBSERVABLES
in collaborazione conServices 16
in collaborazione conServices 17
Creare applicazioni moderne significa fare un passo avanti
anche sui concetti oramai consolidati in programmazione.
Con le attuali esigenze degli utenti, le applicazioni devono
essere sempre più reattive e, allo stesso tempo, essere leggere
da caricare ed eseguire.
in collaborazione conServices 18
Con queste problematiche è nata la programmazione reattiva
(Reactive Programming): un paradigma di programmazione
che, più che basarsi sugli oggetti, si basa su flussi di dati
(tipicamente asincroni) e sulla possibilità che più entità
possano "abbonarsi" (subscribe) a questi flussi.
in collaborazione conServices 19
Tutti noi abbiamo già utilizzato questi flussi asincroni senza
rendersene conto:
in collaborazione conServices 20
A B C
1 4 90
2
3 A1 + B1
La cella C3 calcola automaticamente la somma quando uno dei due parametri cambia
La cella C3 osserva le modifiche di A1 e B1 ed esegue il calcolo se uno dei valori cambia
Le celle A1 e B1 notificano il proprio valore a tutti colori che sono in ascolto
Observables
RxJS
http://reactivex.io/
in collaborazione conServices 21
OBSERVABLE
OBSERVER
HANDLE ERROR COMPLETION
in collaborazione conServices 22
4.
HTTP
in collaborazione conServices 23
in collaborazione conServices 24
È molto probabile che un'applicazione Angular, anche la più
semplice, necessiti di recuperare delle informazioni da un server
remoto.
Per poter utilizzare le richieste HTTP, Angular ci mette a
disposizione due servizi appositi: Http e HttpClient
in collaborazione conServices
Per poter utilizzare il servizio
Http è necessario includere il
modulo HttpModule
25
/* src/app/app.module.ts */
import { NgModule } from '@angular/
core';
import { HttpModule } from
'@angular/http';
@NgModule({
...
imports: [
BrowserModule,
HttpModule
],
...
})
in collaborazione conServices
Per poter utilizzare il servizio
HttpClient è necessario
includere il modulo
HttpClientModule
26
/* src/app/app.module.ts */
import { NgModule } from '@angular/
core';
import { HttpClientModule } from
'@angular/common/http';
@NgModule({
...
imports: [
BrowserModule,
HttpClientModule
],
...
})
in collaborazione conServices
È possibile utilizzare tutti i
termini HTTP più comuni: get,
post, put, delete, patch, head,
options
Il servizio Http ritorna sempre un
Observable.
Con Angular 5 Http è stato
deprecato in favore di
HttpClient
27
/* src/app/shared/logging.service.ts
*/
import { Injectable } from '@angular/
core';
import { Http } from '@angular/http';
@Injecatable()
export class LoggingService {
constructor(private http: Http) {}
getMessage(): Observable<...> {
return this.http.get(`...`);
}
}
in collaborazione conServices
Le stesse modalità sono presenti
in HttpClient.
L'unica differenza è che con
HttpClient è possibile utilizzare
gli interceptor.
28
/* src/app/shared/logging.service.ts
*/
import { Injectable } from '@angular/
core';
import { HttpClient } from '@angular/
common/http';
@Injecatable()
export class LoggingService {
constructor(private http:
HttpClient) {}
getMessage(): Observable<...> {
return this.http.get(`...`);
}
}
in collaborazione conServices
Finché non sottoscriviamo un
Observable, esso non viene creato
e, per cui, nessun valore viene
emesso ai subscribers
29
/* src/app/app.component.ts */
...
constructor(private ls:
LoggingService) {}
ngOnInit() {
this.ls.getMessage()
.subscribe();
}
...
in collaborazione conServices
All'interno di subscribe()
possiamo utilizzare tre metodi
✴success: I dati vengono inviati
correttamente ai subscribers
✴error: c'è un errore che viene
notificato ai subscribers
✴complete: viene chiamata
quando l'observable viene chiuso
30
/* src/app/app.component.ts */
...
constructor(private ls:
LoggingService) {}
ngOnInit() {
this.ls.getMessage()
.subscribe(
(success) => {},
(error) => {},
() => {}
);
}
...
in collaborazione conServices
In qualunque momento è
possibile rimuovere la
sottoscrizione ad un observable.
Se non ci sono altri subscribers,
l'observable viene rimosso dalla
memoria
31
/* src/app/app.component.ts */
...
constructor(private ls:
LoggingService) {}
ngOnDestroy() {
this.ls.getMessage()
.unsubscribe();
}
...
in collaborazione conComponents
© 2017 - Giovanni Buffa
32

More Related Content

What's hot

Zend Framework Workshop Parte2
Zend Framework Workshop Parte2Zend Framework Workshop Parte2
Zend Framework Workshop Parte2massimiliano.wosz
 
Servizi e Dependency Injection in Angular
Servizi e Dependency Injection in AngularServizi e Dependency Injection in Angular
Servizi e Dependency Injection in AngularValerio Como
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webAndrea Dottor
 
ModulAngular
ModulAngularModulAngular
ModulAngularextrategy
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8Valerio Radice
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular OverviewFrancesco Sciuti
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroAndrea Dottor
 
Git Flow - Un modello di branching che funziona
Git Flow - Un modello di branching che funzionaGit Flow - Un modello di branching che funziona
Git Flow - Un modello di branching che funzionaInnoteam Srl
 
Lavorare con applicazioni Brownfield: il caso di 39x27.com
Lavorare con applicazioni Brownfield: il caso di 39x27.comLavorare con applicazioni Brownfield: il caso di 39x27.com
Lavorare con applicazioni Brownfield: il caso di 39x27.comSimone Chiaretta
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012Andrea Dottor
 
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVMRealizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVMCodemotion
 
Angular framework
Angular frameworkAngular framework
Angular frameworkLuca Modica
 

What's hot (15)

Zend Framework Workshop Parte2
Zend Framework Workshop Parte2Zend Framework Workshop Parte2
Zend Framework Workshop Parte2
 
Servizi e Dependency Injection in Angular
Servizi e Dependency Injection in AngularServizi e Dependency Injection in Angular
Servizi e Dependency Injection in Angular
 
Angular Components e Pipe
Angular Components e PipeAngular Components e Pipe
Angular Components e Pipe
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
 
Angularjs
AngularjsAngularjs
Angularjs
 
ModulAngular
ModulAngularModulAngular
ModulAngular
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular Overview
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuro
 
Workshop angular
Workshop angularWorkshop angular
Workshop angular
 
Git Flow - Un modello di branching che funziona
Git Flow - Un modello di branching che funzionaGit Flow - Un modello di branching che funziona
Git Flow - Un modello di branching che funziona
 
Lavorare con applicazioni Brownfield: il caso di 39x27.com
Lavorare con applicazioni Brownfield: il caso di 39x27.comLavorare con applicazioni Brownfield: il caso di 39x27.com
Lavorare con applicazioni Brownfield: il caso di 39x27.com
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
 
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVMRealizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
 
Angular framework
Angular frameworkAngular framework
Angular framework
 

Similar to Introduzioni ai services in Angular 4 e ad RxJS

Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Wellnet srl
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Eugenio Minardi
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
Angular: Servizi e DI
Angular:  Servizi e DIAngular:  Servizi e DI
Angular: Servizi e DIValerio Como
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiAndrea Dottor
 
Slide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdfSlide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdfFlorence Consulting
 
Spring Framework
Spring FrameworkSpring Framework
Spring FrameworkNaLUG
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAndrea Balducci
 
Liferay: Esporre Web Services Custom
Liferay: Esporre Web Services CustomLiferay: Esporre Web Services Custom
Liferay: Esporre Web Services CustomAntonio Musarra
 
MattiaBeltrano_azurePipelines.pptx
MattiaBeltrano_azurePipelines.pptxMattiaBeltrano_azurePipelines.pptx
MattiaBeltrano_azurePipelines.pptxAndreaCapolei1
 
Con Aruba, a lezione di cloud #lezione 31: 'API e Cloud Computing, personali...
Con Aruba, a lezione di cloud  #lezione 31: 'API e Cloud Computing, personali...Con Aruba, a lezione di cloud  #lezione 31: 'API e Cloud Computing, personali...
Con Aruba, a lezione di cloud #lezione 31: 'API e Cloud Computing, personali...Aruba S.p.A.
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angulardotnetcode
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide SitoDavide Sito
 

Similar to Introduzioni ai services in Angular 4 e ad RxJS (20)

Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Components
ComponentsComponents
Components
 
Angular: Servizi e DI
Angular:  Servizi e DIAngular:  Servizi e DI
Angular: Servizi e DI
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivati
 
Slide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdfSlide Mulesoft Meetup Milano #10.pdf
Slide Mulesoft Meetup Milano #10.pdf
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
Corso angular js componenti
Corso angular js componentiCorso angular js componenti
Corso angular js componenti
 
AngularJS-Intro
AngularJS-IntroAngularJS-Intro
AngularJS-Intro
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community Tour
 
Liferay: Esporre Web Services Custom
Liferay: Esporre Web Services CustomLiferay: Esporre Web Services Custom
Liferay: Esporre Web Services Custom
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
MattiaBeltrano_azurePipelines.pptx
MattiaBeltrano_azurePipelines.pptxMattiaBeltrano_azurePipelines.pptx
MattiaBeltrano_azurePipelines.pptx
 
Angular - DI tricks
Angular - DI tricksAngular - DI tricks
Angular - DI tricks
 
react-it.pdf
react-it.pdfreact-it.pdf
react-it.pdf
 
Con Aruba, a lezione di cloud #lezione 31: 'API e Cloud Computing, personali...
Con Aruba, a lezione di cloud  #lezione 31: 'API e Cloud Computing, personali...Con Aruba, a lezione di cloud  #lezione 31: 'API e Cloud Computing, personali...
Con Aruba, a lezione di cloud #lezione 31: 'API e Cloud Computing, personali...
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angular
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 

More from Giovanni Buffa

Introduzione ad ECMAScript 6 (ES6) e TypeScript
Introduzione ad ECMAScript 6 (ES6) e TypeScriptIntroduzione ad ECMAScript 6 (ES6) e TypeScript
Introduzione ad ECMAScript 6 (ES6) e TypeScriptGiovanni Buffa
 
15 concetti importanti su javascript
15 concetti importanti su javascript15 concetti importanti su javascript
15 concetti importanti su javascriptGiovanni Buffa
 
Introduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione ItalianaIntroduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione ItalianaGiovanni Buffa
 
Laboratorio di Web Design 2015/16 - Introduzione al corso
Laboratorio di Web Design 2015/16 - Introduzione al corsoLaboratorio di Web Design 2015/16 - Introduzione al corso
Laboratorio di Web Design 2015/16 - Introduzione al corsoGiovanni Buffa
 
Workshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJSWorkshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJSGiovanni Buffa
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScriptGiovanni Buffa
 
Introduzione a GIT - Laboratorio di Web Design 2014/15
Introduzione a GIT - Laboratorio di Web Design 2014/15Introduzione a GIT - Laboratorio di Web Design 2014/15
Introduzione a GIT - Laboratorio di Web Design 2014/15Giovanni Buffa
 
Developing for Performances - Laboratorio di Web Design 2014/15
Developing for Performances - Laboratorio di Web Design 2014/15Developing for Performances - Laboratorio di Web Design 2014/15
Developing for Performances - Laboratorio di Web Design 2014/15Giovanni Buffa
 
Responsive Web Design & Mobile
Responsive Web Design & MobileResponsive Web Design & Mobile
Responsive Web Design & MobileGiovanni Buffa
 
The CSS Survival Manual - Giovanni Buffa (2014)
The CSS Survival Manual - Giovanni Buffa (2014)The CSS Survival Manual - Giovanni Buffa (2014)
The CSS Survival Manual - Giovanni Buffa (2014)Giovanni Buffa
 
Introduzione al Theme Engin di Drupal 7
Introduzione al Theme Engin di Drupal 7Introduzione al Theme Engin di Drupal 7
Introduzione al Theme Engin di Drupal 7Giovanni Buffa
 
Introduzione a Drupal 7 Entity
Introduzione a Drupal 7 EntityIntroduzione a Drupal 7 Entity
Introduzione a Drupal 7 EntityGiovanni Buffa
 
SEO - Laboratorio di Web Design 2014/15
SEO - Laboratorio di Web Design 2014/15SEO - Laboratorio di Web Design 2014/15
SEO - Laboratorio di Web Design 2014/15Giovanni Buffa
 
Introduzione a SASS - Laboratorio di Web Design 2014/15
Introduzione a SASS - Laboratorio di Web Design 2014/15Introduzione a SASS - Laboratorio di Web Design 2014/15
Introduzione a SASS - Laboratorio di Web Design 2014/15Giovanni Buffa
 
Laboratorio di Web Design Base - 2014/15 - HTML/5
Laboratorio di Web Design Base - 2014/15 - HTML/5Laboratorio di Web Design Base - 2014/15 - HTML/5
Laboratorio di Web Design Base - 2014/15 - HTML/5Giovanni Buffa
 
Laboratorio di Web Design Base - 2014/15 - Web History
Laboratorio di Web Design Base - 2014/15 - Web HistoryLaboratorio di Web Design Base - 2014/15 - Web History
Laboratorio di Web Design Base - 2014/15 - Web HistoryGiovanni Buffa
 
Laboratorio di Web Design 2014/15 - Introduzione al corso
Laboratorio di Web Design 2014/15 - Introduzione al corsoLaboratorio di Web Design 2014/15 - Introduzione al corso
Laboratorio di Web Design 2014/15 - Introduzione al corsoGiovanni Buffa
 

More from Giovanni Buffa (19)

Introduzione ad ECMAScript 6 (ES6) e TypeScript
Introduzione ad ECMAScript 6 (ES6) e TypeScriptIntroduzione ad ECMAScript 6 (ES6) e TypeScript
Introduzione ad ECMAScript 6 (ES6) e TypeScript
 
15 concetti importanti su javascript
15 concetti importanti su javascript15 concetti importanti su javascript
15 concetti importanti su javascript
 
Introduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione ItalianaIntroduzione a Drupal - Versione Italiana
Introduzione a Drupal - Versione Italiana
 
Laboratorio di Web Design 2015/16 - Introduzione al corso
Laboratorio di Web Design 2015/16 - Introduzione al corsoLaboratorio di Web Design 2015/16 - Introduzione al corso
Laboratorio di Web Design 2015/16 - Introduzione al corso
 
Workshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJSWorkshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJS
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
Introduzione a GIT - Laboratorio di Web Design 2014/15
Introduzione a GIT - Laboratorio di Web Design 2014/15Introduzione a GIT - Laboratorio di Web Design 2014/15
Introduzione a GIT - Laboratorio di Web Design 2014/15
 
Developing for Performances - Laboratorio di Web Design 2014/15
Developing for Performances - Laboratorio di Web Design 2014/15Developing for Performances - Laboratorio di Web Design 2014/15
Developing for Performances - Laboratorio di Web Design 2014/15
 
Responsive Web Design & Mobile
Responsive Web Design & MobileResponsive Web Design & Mobile
Responsive Web Design & Mobile
 
The CSS Survival Manual - Giovanni Buffa (2014)
The CSS Survival Manual - Giovanni Buffa (2014)The CSS Survival Manual - Giovanni Buffa (2014)
The CSS Survival Manual - Giovanni Buffa (2014)
 
Introduzione al Theme Engin di Drupal 7
Introduzione al Theme Engin di Drupal 7Introduzione al Theme Engin di Drupal 7
Introduzione al Theme Engin di Drupal 7
 
Introduzione a Drupal 7 Entity
Introduzione a Drupal 7 EntityIntroduzione a Drupal 7 Entity
Introduzione a Drupal 7 Entity
 
SEO - Laboratorio di Web Design 2014/15
SEO - Laboratorio di Web Design 2014/15SEO - Laboratorio di Web Design 2014/15
SEO - Laboratorio di Web Design 2014/15
 
Introduzione a SASS - Laboratorio di Web Design 2014/15
Introduzione a SASS - Laboratorio di Web Design 2014/15Introduzione a SASS - Laboratorio di Web Design 2014/15
Introduzione a SASS - Laboratorio di Web Design 2014/15
 
Introduzione a Drupal
Introduzione a DrupalIntroduzione a Drupal
Introduzione a Drupal
 
CSS - Box Model
CSS - Box ModelCSS - Box Model
CSS - Box Model
 
Laboratorio di Web Design Base - 2014/15 - HTML/5
Laboratorio di Web Design Base - 2014/15 - HTML/5Laboratorio di Web Design Base - 2014/15 - HTML/5
Laboratorio di Web Design Base - 2014/15 - HTML/5
 
Laboratorio di Web Design Base - 2014/15 - Web History
Laboratorio di Web Design Base - 2014/15 - Web HistoryLaboratorio di Web Design Base - 2014/15 - Web History
Laboratorio di Web Design Base - 2014/15 - Web History
 
Laboratorio di Web Design 2014/15 - Introduzione al corso
Laboratorio di Web Design 2014/15 - Introduzione al corsoLaboratorio di Web Design 2014/15 - Introduzione al corso
Laboratorio di Web Design 2014/15 - Introduzione al corso
 

Introduzioni ai services in Angular 4 e ad RxJS

  • 2. in collaborazione conServices 2 È una classe Angular utilizzata per implementare funzionalità indipendenti da una view specifica, o per fornire dati e logica condivisi per più componenti. I services vengono iniettati in altri componenti o servizi tramite dependency injection.
  • 3. in collaborazione conServices 3 La dependecy injection è un design pattern e un meccanismo per la creazione e la distribuzione di parti di una applicazione all'interno di altre parti che le richiedono.
  • 4. in collaborazione conServices 4 Un componente potrebbe avere la necessità di utilizzare un service per ottenere dei dati o per utilizzare delle funzioni. Se un componente "A" si affida ad un altra entità "B", si dice che "A" dipende da "B" e che "B" è una dipendenza di "A".
  • 5. 1. CREARE UN SERVICE in collaborazione conServices 5
  • 6. in collaborazione conServices Solitamente, i services sono parti di logica o dati che vengono condivisi in più componenti. È logico inserirli in una cartella shared. Non sempre, un service è condiviso per l'intera applicazione. 6 -src --app ---shared ----...
  • 7. in collaborazione conServices Il nome del file deve rispecchiare il seguente pattern: service-name.service.ts 7 -src --app ---shared ----logging.service.ts
  • 8. in collaborazione conServices 8 /* src/app/shared/logging.service.ts */ export class LoggingService { }
  • 9. in collaborazione conServices providers Il service, per poter essere utilizzato, va prima definito nell'array providers, all'interno del decorator @Component 9 /* src/app/app.component.ts */ import { Component } from '@angular/ core'; import { LoggingService } from '../ shared/logging.service'; @Component({ providers:[LoggingService], ... }) export class AppComponent { }
  • 10. in collaborazione conServices Il service va poi iniettato, tramite dependency injection, nel componente tramite il suo costruttore 10 /* src/app/app.component.ts */ import { Component } from '@angular/ core'; import { LoggingService } from '../ shared/logging.service'; @Component({ ... }) export class AppComponent { constructor(private ls: LoggingService) {} }
  • 11. in collaborazione conServices 11 La dependency injection in Angular è di tipo gerarchica: i figli del componente nel quale viene iniettato il service riceveranno automaticamente le funzionalità del servizio stesso.
  • 12. in collaborazione conServices Se ChildComponent è figlio di AppComponent (dove è stato iniettato il servizio) allora non è necessario includerlo nell'array providers 12 /* src/app/app.component.ts */ import { Component } from '@angular/ core'; import { LoggingService } from '../ shared/logging.service'; @Component({ ... }) export class ChildComponent { constructor(private ls: LoggingService) {} }
  • 13. in collaborazione conServices 13 AppComponent Child1Component Child2Component ChildChild1Component LoggingService OtherService AppModule GlobalService
  • 15. in collaborazione conServices @Injectable() Il service, grazie ad @Injectable, può ricevere, tramite dependency injection, un altro service. 15 /* src/app/shared/logging.service.ts */ import { Injectable } from '@angular/ core'; import { OtherService } from '../ shared/other.service'; @Injecatable() export class LoggingService { constructor(private os: OtherService) {} }
  • 17. in collaborazione conServices 17 Creare applicazioni moderne significa fare un passo avanti anche sui concetti oramai consolidati in programmazione. Con le attuali esigenze degli utenti, le applicazioni devono essere sempre più reattive e, allo stesso tempo, essere leggere da caricare ed eseguire.
  • 18. in collaborazione conServices 18 Con queste problematiche è nata la programmazione reattiva (Reactive Programming): un paradigma di programmazione che, più che basarsi sugli oggetti, si basa su flussi di dati (tipicamente asincroni) e sulla possibilità che più entità possano "abbonarsi" (subscribe) a questi flussi.
  • 19. in collaborazione conServices 19 Tutti noi abbiamo già utilizzato questi flussi asincroni senza rendersene conto:
  • 20. in collaborazione conServices 20 A B C 1 4 90 2 3 A1 + B1 La cella C3 calcola automaticamente la somma quando uno dei due parametri cambia La cella C3 osserva le modifiche di A1 e B1 ed esegue il calcolo se uno dei valori cambia Le celle A1 e B1 notificano il proprio valore a tutti colori che sono in ascolto
  • 22. OBSERVABLE OBSERVER HANDLE ERROR COMPLETION in collaborazione conServices 22
  • 24. in collaborazione conServices 24 È molto probabile che un'applicazione Angular, anche la più semplice, necessiti di recuperare delle informazioni da un server remoto. Per poter utilizzare le richieste HTTP, Angular ci mette a disposizione due servizi appositi: Http e HttpClient
  • 25. in collaborazione conServices Per poter utilizzare il servizio Http è necessario includere il modulo HttpModule 25 /* src/app/app.module.ts */ import { NgModule } from '@angular/ core'; import { HttpModule } from '@angular/http'; @NgModule({ ... imports: [ BrowserModule, HttpModule ], ... })
  • 26. in collaborazione conServices Per poter utilizzare il servizio HttpClient è necessario includere il modulo HttpClientModule 26 /* src/app/app.module.ts */ import { NgModule } from '@angular/ core'; import { HttpClientModule } from '@angular/common/http'; @NgModule({ ... imports: [ BrowserModule, HttpClientModule ], ... })
  • 27. in collaborazione conServices È possibile utilizzare tutti i termini HTTP più comuni: get, post, put, delete, patch, head, options Il servizio Http ritorna sempre un Observable. Con Angular 5 Http è stato deprecato in favore di HttpClient 27 /* src/app/shared/logging.service.ts */ import { Injectable } from '@angular/ core'; import { Http } from '@angular/http'; @Injecatable() export class LoggingService { constructor(private http: Http) {} getMessage(): Observable<...> { return this.http.get(`...`); } }
  • 28. in collaborazione conServices Le stesse modalità sono presenti in HttpClient. L'unica differenza è che con HttpClient è possibile utilizzare gli interceptor. 28 /* src/app/shared/logging.service.ts */ import { Injectable } from '@angular/ core'; import { HttpClient } from '@angular/ common/http'; @Injecatable() export class LoggingService { constructor(private http: HttpClient) {} getMessage(): Observable<...> { return this.http.get(`...`); } }
  • 29. in collaborazione conServices Finché non sottoscriviamo un Observable, esso non viene creato e, per cui, nessun valore viene emesso ai subscribers 29 /* src/app/app.component.ts */ ... constructor(private ls: LoggingService) {} ngOnInit() { this.ls.getMessage() .subscribe(); } ...
  • 30. in collaborazione conServices All'interno di subscribe() possiamo utilizzare tre metodi ✴success: I dati vengono inviati correttamente ai subscribers ✴error: c'è un errore che viene notificato ai subscribers ✴complete: viene chiamata quando l'observable viene chiuso 30 /* src/app/app.component.ts */ ... constructor(private ls: LoggingService) {} ngOnInit() { this.ls.getMessage() .subscribe( (success) => {}, (error) => {}, () => {} ); } ...
  • 31. in collaborazione conServices In qualunque momento è possibile rimuovere la sottoscrizione ad un observable. Se non ci sono altri subscribers, l'observable viene rimosso dalla memoria 31 /* src/app/app.component.ts */ ... constructor(private ls: LoggingService) {} ngOnDestroy() { this.ls.getMessage() .unsubscribe(); } ...
  • 32. in collaborazione conComponents © 2017 - Giovanni Buffa 32