javascript - angular2 ruttvaktsvalideringar


Jag skapar en ny app med Angular och jag vill ställa in vissa valideringar på ruttvakter. Till exempel är min URL: localhost:4200/#/products och om jag vill navigera från menyn till en annan sida i min app localhost:4200/#/invoice vill jag inte att det ska vara möjligt att navigera bara genom att manuellt ändra URL:en och skriva invoice istället för products, men endast vid menyval.

så det här är min vakt:

import { Injectable } from '@angular/core' ;
import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivate, Router } from '@angular/router';

@Injectable()
export class AlwaysAuthGuard implements CanActivate {
        canActivate() {
          console.log('AlwaysAuthGuard');
          return true;
        }
      }

och detta är routerningstjänsten:

const appRoutes: Routes = [
  { path: '', redirectTo: 'login', pathMatch: 'full' },
  { path: 'login', component: AppLoginComponent, data: { title: 'Login' }},
  { path: 'invoice', component: InvoiceComponent, canActivate: [AlwaysAuthGuard], data: { title: 'Invoice' }},
  { path: 'products', component: ProductsComponent, data: { title: 'Products' }},
  { path: 'logout', component: LogoutComponent, data: { title: 'Logout' }},
  { path: '**', component: NotFoundComponent, data: { title: 'Page Not Found' }}
];

export const appRoutingProviders: any[] = [];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes, { useHash : true });

Så hur kan jag lägga till vissa valideringar där jag begränsar URL-ändringen och tillåter användaren att navigera till andra sidor endast från navigeringsmenyn när de klickar.

Svar #1

Du kan helt enkelt lagra någon flagga vid menyval. exempel:

lyssna efter klickhändelse på din menylänk och gör sedan följande:

localstorage.setItem('menu-clicked', 'true');

och sedan i din 'AlwaysAuthGuard' kolla om 'menu-clicked' finns i localstorage eller inte. exempel:

canActivate() {
   // console.log('AlwaysAuthGuard');
   if(localstorage.getItem('menu-clicked') == 'true'){
      localstorage.removeItem('menu-clicked');
      return true;
   }
   return false;
}