2016-08-29 23 views
5

Tôi có một câu hỏi nhỏ liên quan đến bộ định tuyến Angular 2 sử dụng phiên bản 3.0.0-rc.1 Tôi muốn điều hướng đến thành phần nhà khác dựa trên vai trò người dùng như AdminComponent hoặc UserComponent. Bất cứ ai có thể xin giúp đỡ trong việc sửa đổi các tuyến đường dưới đây để tôi có thể đạt được các chức năng mong muốn?Góc 2 Điều hướng dựa trên vai trò trên cùng một đường dẫn

{path: 'login', component: LoginComponent}, // <--- This redirects to '/' in case user is logged in 
{ 
    path: '', 
    component: HomeComponent,    
    canActivate: [AuthGuardService], // <--- Check if user is logged in, else redirect to login 
    children: [ 
    { 
     path: '', 
     component: AdminComponent // <--- Want to navigate here if user role is 'admin' 
    }, 
    { 
     path: '', 
     component: UserComponent // <--- Want to navigate here if user role is 'user' 
    } 
    ] 
} 

AuthGuardService.ts

import {Injectable} from "@angular/core"; 
import {CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot} from "@angular/router"; 
import {AuthService} from "./auth.service"; 

@Injectable() 
export class AuthGuardService implements CanActivate { 

    constructor(private authService: AuthService, private router: Router) { 
    } 

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

    // Store the attempted URL for redirecting 
    this.authService.redirectUrl = state.url; 

    // Navigate to the login page with extras 
    this.router.navigate(['/login']); 
    return false; 
    } 
} 

AuthService.ts

import {Injectable} from "@angular/core"; 

@Injectable() 
export class AuthService { 
    redirectUrl: string; 

    logout() { 
    localStorage.clear(); 
    } 

    isLoggedIn() { 
    return localStorage.getItem('token') !== null; 
    } 

    isAdmin() { 
    return localStorage.getItem('role') === 'admin'; 
    } 
} 

Cảm ơn.

+0

cậu con số nó ra? – Dmitry

+0

@Dmitry không may mắn nào – Ankush

Trả lời

-1

Vấn đề là bạn không thể có hai tuyến đường có cùng đường dẫn. Thay đổi dễ dàng nhất mà bạn có thể thực hiện là thay đổi đường dẫn đến một cái gì đó như thế này:

{ 
     path: 'admin', 
     component: AdminComponent 
    }, 
    { 
     path: 'user', 
     component: UserComponent 
    } 

Đây có lẽ là lựa chọn tốt nhất vì bạn muốn các thành phần khác nhau dựa trên vai trò người dùng. Bạn cũng có thể muốn các thành phần khác khác nhau và bạn có thể làm điều đó một cách dễ dàng bằng cách thêm trẻ em vào quản trị viên hoặc tuyến đường người dùng.

Trong AuthGuard, bạn vẫn chỉ trả về true, nhưng bạn thực hiện hai bảo vệ khác cho quản trị viên và tuyến đường người dùng. Kiểm tra xem người dùng có phải là người quản trị hay không.

Và bạn chuyển hướng đến con đường đúng bằng cách kiểm tra vai trò người dùng một lần ông Loges trong và sau đó trong thành phần bạn router.navigate(['/admin']) hoặc router.navigate(['/user'])

+0

đúng, điều này có vẻ như là giải pháp duy nhất ngay bây giờ. Nhưng nó sẽ là tuyệt vời nếu có một số giải pháp thay đổi thành phần mà không thay đổi url – Ankush

+0

Tôi không thực sự chắc chắn về điều đó. Tôi nghĩ một trang nên luôn có cùng một thành phần. Nếu bạn nghĩ về điều đó thì việc phản đối trực quan để người dùng thấy một trang khác trên cùng một url. Tôi đoán trong trường hợp của bạn nó không thực sự là một vấn đề vì bạn có hai khu vực hoàn toàn riêng biệt dựa trên vai trò người dùng, nhưng trong hầu hết các trường hợp, nó không nên thực sự được thực hiện như thế. –

Các vấn đề liên quan