Trasowanie w Angular 2 - Instytut Informatyki Teoretycznej i
Transkrypt
Trasowanie w Angular 2 - Instytut Informatyki Teoretycznej i
Trasowanie w Angular 2 Trasowanie w Angular 2 Tworzenie serwisów Web 2.0 dr inż. Robert Perliński [email protected] Politechnika Częstochowska Instytut Informatyki Teoretycznej i Stosowanej 6 czerwca 2016 1/21 Plan prezentacji 1 Trasowanie w Angular 2 Informacje ogólne Komponent nawigacyjny Komponent Router, konfiguracja Parametry w adresie URL Tablica parametrów odnośnika 2 Źródła Trasowanie w Angular 2 2/21 Angular 2 https://angular.io/ Warto polecić: http://www.angular2.com/ - zbiór odnośników związanych z Angular 2 https://egghead.io/technologies/angular2 - przewodnik video po Angular 2 Trasowanie w Angular 2 3/21 Trasowanie - Component Router Component Router w Angular 2 umożliwia nawigowanie między widokami zależnie od działań użytkownika. Widoki związane z nawigacją odpowiadają różnym adresom URL. Obecna dokumentacja opisuje przestarzały Component Router beta. Jest on zastąpiony przez Component Router release candidate, do którego dokumentacja dopiero powstaje. Nawigacja w przeglądarce funkcjonuje poprzez: wpisanie adresu URL, kliknięcie odnośnika na stronie, w aplikacji, kliknięcie przycisków Wstecz i Dalej. Trasowanie w Angular 2 4/21 Elementy związane z trasowaniem w Angular Elementy związane z trasowaniem w Angular 2: ustawienie bazowego odnośnika - base href, importowanie bibliotek do trasowania, konfigurowanie trasowania, tablica z parametrami tras (ang. link parameters array ), nawigowanie z użyciem dyrektywy RouterLink, nawigowanie z wnętrza kodu aplikacji, dołączanie informacji jako parametry w adresie URL, ustawienie domyślnej trasy, utworznie podrzędnego mechanizmu trasowania z własnymi trasami, wykorzystanie wstawek programowych w związku z trasowaniem, przekazywanie dodatkowych informacji w parametrach URL (ang. query parameters), obsługa dwóch stylów adresów URL (HTML5 i hash). Trasowanie w Angular 2 5/21 Terminy związane z trasowaniem I Najważniejsze terminy związane z trasowaniem: Router - wyświetla komponent aplikacji związany z aktualnym adresem URL; obsługuje nawigację z jednego komponentu do następnego, @RouteConfig - konfiguruje mechanizm trasowania dzięki definicjom tras (ang. RouteDefinitions), każda łączy adres URL z komponentem, definicje tras - określa jak mechanizm trasowania powinien przejść do komponentu bazując na wzorcu adresu URL, trasa (ang. Route) - najbardziej powszechna forma definicji trasy składa się ze: ścieżki, nazwy trasy i typu komponentu, RouterOutlet - dyrektywa <router-outlet> określająca, gdzie mechanizm trasowania powinien wyświetlić widok. Trasowanie w Angular 2 6/21 Terminy związane z trasowaniem I Najważniejsze terminy związane z trasowaniem: RouterLink - dyrektywa wiążąca element HTML, który można klinkąć z jedna z tras. Kliknięcie odnośnika z dyrektywą routerLink, która jest połączona z Tablicą Parametrów Odnośnika wywołuje nawigację. Tablica Parametrów Odnośnika (ang. Link Parameters Array ) tablica, którą mechanizm trasowania interpretuje jako instrukcje tras. Można dowązać taką tablicę do dyrektywy RouterLink albo przekazać taką tablicę do metody Router.navigate(). Komponent nawigacyjny - komponent Angulara, który ma dołączone trasowanie. Trasowanie w Angular 2 7/21 Nadrzędny komponent odpowiedzialny za trasowanie Główny komponent będzie prezentował opcje wyboru komponentu, który chcemy wyświetlić. Jeden z nich powinien być domyślnym komponentem (useAsDefault: true). Nadrzędny komponent (AppComponent) odpowiada tylko za nawigację. Taki komponent nazywamy wtedy komponentem nawigacyjnym (ang. Router Component). Komponent nadrzędny, nawigacyjny posiada: linki nawigacyjne na górze strony, obszar pod linkami wyświetlający wybrany komponent. Trasowanie w Angular 2 8/21 Nadrzędny komponent - przygotowanie usługi app.compponent.ts import { Component } from '@angular/core'; import { HeroService } from './hero.service'; import { HeroesComponent } from './heroes.component'; @Component({ selector: 'my-app', template: ‘ <h1>{{title}}</h1> <my-heroes></my-heroes> ‘, directives: [ HeroesComponent ], providers: [ HeroService ] }) export class AppComponent { title = 'Wprowadzenie o bohaterach'; } Usługa pobierająca dane o bohaterach będzie w tablicy providers tylko w nadrzędnym komponencie. Cała aplikacja będzie miała jeden egzemplarz usługi HeroService. Trasowanie w Angular 2 9/21 Bazowy adres URL Większość aplikacji powinna dodać element <base> do pliku index.html na górze sekcji <head>. Informuje to mechanizm trasowania (Router) jak składać adresy URL. Jeśli folder app jest nadrzędnym katalogiem aplikacji to wartość href ustawiamy: index.html (fragment) <head> <base href="/"> ... </head> Trasowanie w Angular 2 10/21 Komponent Router Komponent Router to usługa. Importujemy ją i dodajemy do tablicy providers, żeby była dostępna. Usługa Router w Angular 2 jest kombinacją: wielu usług (ROUTER PROVIDERS), wielu dyrektyw (ROUTER DIRECTIVES), tablicy metadanych konfiguracji (RouteConfig) app.compponent.ts (fragment) import { RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router-deprecated'; ... @Component({ selector: 'my-app', template: ‘<h1>{{title}}</h1> ...‘, directives: [ ROUTER_DIRECTIVES ], providers: [ ROUTER_PROVIDERS, HeroService ] }) AppComponent nie potrzebuje już HeroesComponent. Za wyświetlenie listy bohaterów będzie odpowiedzialny teraz Router. Trasowanie w Angular 2 11/21 Konfiguracja komponentu Router I Utworzenie trasowania wymaga użycia dekoratora @RouteConfig. W tablicy @RouteConfig jednocześnie: przypisujemy mechanizm trasowania do komponentu, określamy konkretną ścieżkę dla tego trasowania. Uzyskujemy połączony adres URL z konkretnym widokiem. app.compponent.ts (fragment) @RouteConfig([ { path: '/heroes', name: 'Heroes', component: HeroesComponent } ]) path - dopasowuje adres z trasowania do tego w przeglądarce, name - oficjalna nazwa danej trasy, musi być PascalCase, component - komponent tworzony przez mechanizm trasowania po wyborze danej trasy. Trasowanie w Angular 2 12/21 Konfiguracja komponentu Router II app.compponent.ts (fragment) { path: '/dashboard', name: 'Dashboard', component: DashboardComponent, useAsDefault: true }, { path: '/detail/:id', name: 'HeroDetail', component: HeroDetailComponent } useAsDefault - właściwość określająca, która z tras (jeśli żadna nie zostanie dopasowana) ma zostać automatycznie wykorzystana, :id - token określający parametr; dla adresu /detail/23 wartością parametru id będzie "23". Trasowanie w Angular 2 13/21 Router Outlet czyli ”wyjście”trasowania Gdzie mechanizm trasowania ma wyświetlić wybrany adres? Położenie wybranego komponentu określamy znacznikiem <router-outlet> w szablonie komponentu. RouterOutlet to jedna z dyrektyw trasowania (ROUTER DIRECTIVES). app.compponent.ts (fragment) @Component({ selector: 'my-app', template: ‘ <h1>{{title}}</h1> <nav> <a [routerLink]="['Heroes']">Bohaterowie</a> <a [routerLink]="['Dashboard']">Deska rozdzielcza</a> </nav> <router-outlet></router-outlet> ‘, directives: [ ROUTER_DIRECTIVES ], providers: [ ROUTER_PROVIDERS, HeroService ] }) Trasowanie w Angular 2 14/21 Odnośniki w trasowaniu Chcielibyśmy móc wykorzystać zdefiniowane trasy w szablonie. Dyrektywa RouterLink pozwala na wykorzystanie tablicy adresów. Wstawiamy odnośnik do szablonu, podajemy nazwę trasy. Informujemy mechanizm trasowania, który widok wczytać po kliknięciu. app.compponent.ts (fragment) @Component({ selector: 'my-app', template: ‘ <h1>{{title}}</h1> <nav> <a [routerLink]="['Heroes']">Bohaterowie</a> <a [routerLink]="['Dashboard']">Deska rozdzielcza</a> </nav> <router-outlet></router-outlet> ‘, directives: [ ROUTER_DIRECTIVES ], providers: [ ROUTER_PROVIDERS, HeroService ] }) Trasowanie w Angular 2 15/21 Nawigacja do adresu z parametrem Mając komponent związany z określoną trasą możemy do niego przechodzić z dowolnego miejsca aplikacji. Dotyczy to również adresu z parametrem, np. /detail/:id. Należy dodać obsługę parametrów trasowania: hero-detail.compponent.ts (początek) import { Component, OnInit } from '@angular/core'; import { RouteParams } from '@angular/router-deprecated'; import { Bohater } from './bohater'; import { HeroService } from './hero.service'; ... Importujemy też usługę - przekazane id wykorzystamy do pobrania odpowiedniego bohatera. Wykorzystujemy wstawkę OnInit - przy poprawnym adresie z parametrem musimy pobrać bohatera po utworzeniu komponentu. Trasowanie w Angular 2 16/21 Komponent obsługujący adres z parametrem Konstruktor komponentu HeroDetailComponent wykorzystuje dwie usługi. Metoda get() usługi RouteParams zwraca wartość parametru jako string. Metoda goBack() cofa o jedną pozycję w historii przeglądania. hero-detail.component.ts export class HeroDetailComponent implements OnInit { hero: Bohater; constructor( private heroService: HeroService, private routeParams: RouteParams) { } ngOnInit() { let id = +this.routeParams.get('id'); // dodawanie - zmiena na liczbę... this.heroService.getHero(id) .then(hero => this.hero = hero); } goBack() { window.history.back(); } } Trasowanie w Angular 2 17/21 Komponent obsługujący adres z parametrem - szablon Dla zdarzenia (click) przycisku Back mamy powrót do poprzedniej strony. hero-detail.component.html <div *ngIf="hero"> <h2>Informacje szczegółowe o {{hero.name}}!</h2> <div><label>id: </label>{{hero.id}}</div> <div> <label>nazwa: </label> <input [(ngModel)]="hero.name" placeholder="name"> </div> </div> <button (click)="goBack()">Back</button> Przenieśliśmy cały szablon do osobnego pliku (właściwość templateUrl). Metadane komponentu wyglądają następująco: hero-detail.component.ts @Component({ selector: 'my-hero-detail', templateUrl: 'app/hero-detail.component.html', styleUrls: ['app/hero-detail.component.css'] }) Trasowanie w Angular 2 18/21 Nawigowanie do wybranego bohatera W szablonie komponentu DashboardComponent wiążemy zdarzenie kliknięcia z metodą gotoDetail(). dashboard.component.html ... <div *ngFor="let hero of heroes" (click)="gotoDetail(hero)"> ... Metoda gotoDetail wewnątrz komponentu: tworzy link - tablicę określającą adres URL i jego parametr, przekazuje tablicę do mechanizmu trasowania - następuję nawigacja. dashboard.component.ts export class DashboardComponent implements OnInit { ... gotoDetail(hero: Bohater) { let link = ['HeroDetail', { id: hero.id }]; this.router.navigate(link); } } Trasowanie w Angular 2 19/21 Tablice z parametrami odnośnika Komponent nadrzędny AppComponent zawierał odnośniki do tras, które zawierały tylko jeden parametr. Określał on nazwę trasy w konfiguracji mechanizmu trasowania: app.component.ts <a [routerLink]="['Heroes']">Bohaterowie</a> Tutaj tablica zawiera dwa elementy: nazwę trasy w konfiguracji mechanizmu trasowania, obiekt parametru trasy z polem id (numer id wybranego bohatera). dashboard.component.ts let link = ['HeroDetail', { id: hero.id }]; Trasowanie w Angular 2 20/21 Źródła https: //angular.io/docs/ts/latest/guide/router-deprecated.html https://angular.io/docs/ts/latest/tutorial/toh-pt5.html Trasowanie w Angular 2 21/21