2016-07-11 13 views
13

Buduję aplikację angular2 i obecnie mam komponent domowy z navbarem, paskiem narzędzi i gniazdem routera dla głównej zawartości. Chcę dodać jedną dodatkową stronę dla mechanizmu logowania, więc jeśli użytkownik nie jest uwierzytelniony, strona logowania będzie wyświetlana na całym ekranie, a po zalogowaniu się do użytkownika zostanie wyświetlona pozycja składnika o strukturze powyżej.Angular2 - gniazdo routera ze strukturą logowania

Jak zarządzać tą strukturą? Czy potrzebuję dwóch gniazd routera? pierwszy do nawigacji pomiędzy loginem a stronami głównymi, a drugi do głównej treści na stronie głównej? Jakakolwiek inna pospolita struktura, która jest bardziej prosta niż dwa wyjścia routera?

+0

szczęście przy odpowiedzi poniżej? –

+0

Wciąż brakuje mi jednej rzeczy, podstawowa strona aplikacji zawiera gniazdo routera z widocznym komponentem logowania, jeśli żaden użytkownik nie jest zalogowany lub komponent domowy, jeśli użytkownik się zalogował, wewnątrz komponentu domowego potrzebuję innego gniazda routera, które zmienia się po nawigacji użytkownika ? – galvan

+0

Ah, widzę twoje pytanie. Powinieneś także mieć komponent najwyższego poziomu, nazwij to "App" - i tam powinien iść twój ''. Sprawdź ten artykuł: składniki najwyższego poziomu: https://scotch.io/tutorials/creating-your-first-angular-2-components –

Odpowiedz

9

Udaje mi się osiągnąć ten przepływ pracy poprzez wdrożenie tej struktury. Mam dwa główne komponenty:

LoginComponent, którego trasa to "/ login". HomeComponent, którym jest trasa to "". (pusta trasa).

Dodatkowo ustawiłem straż dla mojego HomeComponent, który sprawdza, czy użytkownik jest uwierzytelniony w jego canActivate. Jeśli nie, nawiguję użytkownika do trasy "/ login".

Następnie w moim komponencie macierzystym mam szablon o następującej strukturze: pasek narzędzi, menu boczne i gniazdo routera.

Ostatnią rzeczą, którą muszę zrobić, to skonfigurować inne trasy aplikacji jako ścieżki potomne mojego HomeComponent. (na przykład: "/ news" to trasa podrzędna "").

+0

Dziękujemy za opublikowanie odpowiedzi. Wdrożyłem to również w ten sposób i jestem o wiele szczęśliwszy niż moje poprzednie (bardzo hacky) rozwiązanie. Zagnieżdżiłem go również na dwóch poziomach, więc mam swój LoginComponent i komponent Header ('path: '''), Header ma ścieżkę potomną dla NavigationComponent (również 'path: '''), i która ma wszystkie moje inne trasy dla dzieci. W ten sposób mogę mieć trasy, które mają tylko nagłówek bez nav, lub trasy, które mają oba lub żadne. Jeśli chciałbym strony z nagłówkiem, ale bez nawigacji, dodałbym ją jako dziecko trasy nagłówka. – Travesty3

+2

Czy możesz wskazać mi przykład, w którym go zaimplementowałeś? – Eni

+0

@ Travesty3 oznacza, że ​​masz 2 gniazda routera –

-1

Przede wszystkim bardzo polecam korzystanie ze zaktualizowanego routera Angular2. Najnowszy router zawiera obsługę guards, które są dodawane do konfiguracji trasy, aby uniemożliwić dostęp do określonych tras.

Po upewnieniu się, że masz najnowszą routera, musisz zrobić kilka rzeczy:

1) Utwórz komponent najwyższego poziomu i nazywają to App. Tutaj przejdzie Twoja <router-outlet>.

2) Utwórz komponent Login. Ten komponent powinien zawierać formularz logowania do aplikacji, wraz z logiką obsługi logowania. Utwórz trasę dla tego komponentu.

3) Utwórz komponent Home (już to zrobiłeś).

4) Użyj guard (nowa funkcjonalność w najnowszej routera), aby uniemożliwić użytkownikom dostęp do komponentu domu przed zalogowaniu

Twój kod będzie wyglądać mniej więcej tak (aby uzyskać więcej informacji, zobacz:. https://medium.com/@blacksonic86/upgrading-to-the-new-angular-2-router-255605d9da26#.n7n1lc5cl)

// auth-guard.ts 
import { Injectable } from '@angular/core'; 
import { 
    CanActivate, 
    Router, 
    ActivatedRouteSnapshot, 
    RouterStateSnapshot 
} from '@angular/router'; 

import { AuthService } from './services/auth/auth.service'; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private authService: AuthService, private router: Router) {} 

    canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    if (this.authService.isLoggedIn()) { 
     return true; 
    } 

    this.router.navigate(['login']); 
    return false; 
    } 
} 

Aby uzyskać więcej informacji na strażników:

Chciałbym również gorąco polecam czytania na najnowszej Kątowymi routera (docs zostały niedawno aktualizacja): https://angular.io/docs/ts/latest/guide/router.html

Powiązane problemy