Je crée une application angular2-meteor.
export const routes: Route[] = [{
path: '',
redirectTo: "login",
pathMatch: "full"
},
{
path: 'login',
component: LoginComponent
},
{
path: 'csvtemplate',
component: TemplateComponent,
canActivate: ['canActivateForLoggedIn'],
children: [{
path: '',
redirectTo: 'dashboard' <----how to add condition for multiple path
},
{
path:'dashboard',
component: DashboardComponent
},
{
path: 'csvtimeline/:month/:year',
component: CsvTimelineComponent
}, {
path: 'csvjson',
component: CsvJsonComponent
}]
}];
Lorsque je me connecte à mon application à l'aide de LoginComponent, elle ira à TemplateComponent qui a trois composants enfants
Maintenant, j'ai par défaut défini redirectTo sur mon composant de tableau de bord. mais à la place de cette redirection, je veux rediriger vers le composant csvjson ou le composant csvtimeline en fonction du profil utilisateur de connexion.
Supposer
Si l'utilisateur de connexion est "Admin", il doit être redirigé vers -> Composant du tableau de bord
Si l'utilisateur de connexion est "Invité", il doit être redirigé vers -> composant csvjson
je sais que nous pouvons le faire dans ngOnInit () du composant de tableau de bord pour la redirection.
if (this.user && this.user.profile.role == 'Guest') {
this._router.navigate(['csvtemplate/csvjson']);
}
mais je cherche une meilleure option pour ne pas avoir à ouvrir le composant de tableau de bord à chaque fois et il ira directement au composant csvjson.
Voici la meilleure solution Protégez la fonction d'administration selon Angular guide.
Utilisation du crochet CanActivate Étapes:
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { Router } from '@angular/router';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate() {
//Your redirect logic/condition. I use this.
if (this.user && this.user.profile.role == 'Guest') {
this.router.navigate(['dashboard']);
}
console.log('AuthGuard#canActivate called');
return true;
}
//Constructor
constructor(private router: Router) { }
}
import { AuthGuard } from './auth-guard.service';
import { AdminComponent } from './admin/admin.component';
@NgModule({
declarations: [
AppComponent,
AdminComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
RouterModule.forRoot([
{
path: 'admin',
component: AdminComponent,
canActivate:[AuthGuard]
},
{
path: '',
redirectTo: '/dashboard',
pathMatch: 'full'
}
])
],
providers: [AuthGuard],
bootstrap: [AppComponent]
})
export class AppModule { }
** Référence ** https://angular.io/docs/ts/latest/guide/router.html#!#can-activate-guard
Dans le module de routage, vous devez créer une variable locale "route", vérifier la condition et attribuer le chemin de routage requis à la variable et affecter la variable à rediriger vers le routage
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
var route: string = "user";
const role = JSON.parse(localStorage.getItem("currentUser")).roleId;
if (role == "1") {
//superadmin role
route = "project"
} else {
//normal user role
route = "user"
}
const adminRoutes: Routes = [ {
path: '',
component: AdminComponent,
canActivate: [AuthGuard],
children: [
{ path: '', redirectTo: route },
{
path: 'project',
loadChildren: './project-dashboard/project-dashboard.module#ProjectModule'
}, {
path: 'user',
loadChildren: './user/user.module#UserModule',
}