Realizzare la navigazione in Hacker News. 02 Form Raccogliere e validare i dati dell’utente. 03 Challenge Permettere l’inserimento di un nuovo link in Hacker News. 04
dello stato applicativo nella URL. Mantenere lo stato dell’applicazione 01 Dividere l’applicazione per aree di interesse e caricarle quando necessario. Implementare applicazioni modulari 02 Perché routing?
dello stato applicativo nella URL. Mantenere lo stato dell’applicazione 01 Dividere l’applicazione per aree di interesse e caricarle quando necessario. Implementare applicazioni modulari 02 Garantire o impedire l’accesso a delle aree in base al ruolo dell’utente. Realizzare sicurezza role-based 03 Perché routing?
di rotte e passarle al modulo RouterModule tramite la funzione forRoot. Router Module È una delle direttive router disponibili in RouterModule. Dice al router dove posizionare la vista da mostrare. Router Outlet <div> <router-outlet></router-outlet> </div>
di rotte e passarle al modulo RouterModule tramite la funzione forRoot. Router Module È una delle direttive router disponibili in RouterModule. Dice al router dove posizionare la vista da mostrare. Router Outlet Router.navigate e RouterLink sono rispettivamente il metodo e la direttiva che permettono le navigazioni del router. Router Navigate e Router Link constructor( router: Router ) { router.navigate([‘path1']); } -- oppure -- <div> <a routerLink="path1">Path 1</a> </div>
di rotte e passarle al modulo RouterModule tramite la funzione forRoot. Router Module È una delle direttive router disponibili in RouterModule. Dice al router dove posizionare la vista da mostrare. Router Outlet Router.navigate e RouterLink sono il metodo e la direttiva che permettono le navigazioni del router. Router Navigate e Router Link Una buona pratica consiste nel configurare il router in un modulo separato dedicato al routing e importarlo nel modulo di root AppModule. const routes: Routes = [ {path:’/path1’, component:Cmp1}, {path:’/path2’, component:Cmp2}, {path:’**’, redirectTo:’path1’} ]; @NgModule({ imports: [ RouterModule.forRoot(routes) ], exports: [RouterModule] }) export class AppRoutingModule { }
• Definire un nuovo componente con nome CreateLink contenente solo un tag titolo • Sostituire la direttiva hn-link-list con la direttiva router-outlet nel component AppComponent • Definire 3 rotte • La rotta / dovrà mostrare il componente LinkList • La rotta /create dovrà mostrare il component CreateLink • La rotta ** dovrà reindirizzare alla rotta / • Aggiungere dei routerLink all’header in AppComponent • Al link new dovrà corrispondere la rotta / • Al link submit dovrà corrispondere la rotta /create • Testare il tutto navigando avanti e indietro con i link nell’header e con i pulsanti per la gestione della history del browser • BONUS: configurare il router nel modulo AppRoutingModule, ed importarlo in AppModule Adesso tocca a voi
sul percorso associato al componente caricato nel router-outlet ActivatedRoute Rappresentano i parametri di una rotta sotto forma di Observable. Params e ParamMap const routes: Routes = [{ path: ’/path1/:param1’, component: Cmp1 }]; -- e -- route.params .subscribe(p => { let param1 = p['param1’]; });
sul percorso associato al componente caricato nel router-outlet ActivatedRoute Rappresentano i parametri di una rotta sotto forma di Observable. Params e ParamMap Rappresentano i parametri di questi di una rotta, anch’essi sotto forma di Observable. QueryParams e QueryParamMap route.queryParams .subscribe(qp => { let param1 = qp['param1’]; }); -- oppure -- route.queryParamMap .subscribe(qp => { let param1 = qp.get('param1’); });
sul percorso associato al componente caricato nel router-outlet ActivatedRoute Rappresentano i parametri di una rotta sotto forma di Observable. Params e ParamMap Rappresentano i parametri di questi di una rotta, anch’essi sotto forma di Observable. QueryParams e QueryParamMap router.navigate( [ '/path1', ‘foo’ ], { queryParams: {param1: ‘bar’} } ); -- oppure -- <a [routerLink]="['/path1’, ‘foo’]" [queryParams]="{param1: ‘bar’}" >…</a> Per aggiungere un parametro alla navigazione bisogna specificarlo nella router.navigate o nel routerLink. Per un parametro query bisogna usare il secondo argomento di router.navigate o la direttiva queryParams.
della componente LinkListComponent usando routerLink • Al click l’applicazione deve navigare alla pagina successiva a quella attuale • La pagina è indicata dal parametro opzionale di nome p • Riscrivere il comportamento della componente LinkListComponent usando ActivatedRoute: • All’avvio deve mostrare i dati inerenti alla pagina specificata nel parametro query p • Se il parametro non è specificato ha valore 1 di default • Testare il tutto navigando avanti e indietro con il link More e con i pulsanti per la gestione della history del browser • BONUS: cercare di realizzare il secondo punto usando solo gli operators map, startWith, do e switchMap di RxJS Adesso tocca a voi
cambiamenti, validazione ed gestione degli errori Requirements Creare un’esperienza che guidi l’utente in maniera efficace ed efficiente attraverso il workflow. Data-entry experience Offre 2 alternative: Template-driven forms Reactive forms Angular user inputs need Applications
name="myInput" type="text" ngModel /> <button (click)="submit(myForm)"> Submit </button> </form> Definiscono la struttura logica della form all’interno del template HTML ngForm & ngModel
cambiamento del focus di myInput myForm.controls.myInput.untouched myForm.controls.myInput.touched // valutare il cambiamento del valore di myInput myForm.controls.myInput.pristine myForm.controls.myInput.dirty Definiscono la struttura logica della form all’interno del template HTML ngForm & ngModel Combinazione dei parametri di validazione introdotti con HTML5 Validazione Valutazione dell’interazione dell’utente con i campi e con i valori al suo interno Tracciamento dei cambiamenti
validità del valore di myInput … .myInput.errors.required … .myInput.errors.maxLength … .myInput.errors.minLength … .myInput.errors.pattern Definiscono la struttura logica della form all’interno del template HTML ngForm & ngModel Combinazione dei parametri di validazione introdotti con HTML5 Validazione Valutazione dell’interazione dell’utente con i campi e con i valori al suo interno Tracciamento dei cambiamenti Valutazione della validità di ogni campo e presentazione di un messaggio di errore Gestione degli errori
validità del valore di myInput … .myInput.errors?.required … .myInput.errors?.maxLength … .myInput.errors?.minLength … .myInput.errors?.pattern Definiscono la struttura logica della form all’interno del template HTML ngForm & ngModel Combinazione dei parametri di validazione introdotti con HTML5 Validazione Valutazione dell’interazione dell’utente con i campi e con i valori al suo interno Tracciamento dei cambiamenti Valutazione della validità di ogni campo e presentazione di un messaggio di errore Gestione degli errori Elvis operator (?) permette di evitare i null check all’interno di un template HTML
component CreateLink • Inserire un campo di input di tipo text che permetta di inserire la descrizione del nuovo link • Il valore del campo deve essere inserito obbligatoriamente, in caso contrario mostrare un messaggio di errore • Il valore del campo non deve superare i 100 caratteri, in caso contrario mostrare un messaggio di errore • Inserire un campo di input di tipo url che permetta di inserire la url del nuovo link • Il valore del campo deve essere inserito obbligatoriamente, in caso contrario mostrare un messaggio di errore • Inserire un pulsante che permetta di salvare i dati nella form: • Se i dati non sono validi il pulsante deve essere disabilitato • Se i dati sono validi vanno inviati al server tramite il metodo addLink del servizio ApiService • A salvataggio effettuato navigare verso la rotta / • BONUS: Validare la correttezza della url (e.g. [urlscheme]://[restofurl]) Adesso tocca a voi
e affidabilità. Maturo 01 Adatto a prototipazioni rapide tanto quanto ad applicazioni mastodontiche. Duttile 02 Curva di apprendimento alta e impossibilità di utilizzo parziale. Ostile 03