AuthGuard показывает пустую страницу - PullRequest
0 голосов
/ 23 марта 2020

Я использую AuthGuard для защиты компонентов до тех пор, пока пользователь не вошел в систему. AuthGuards работает, но всякий раз, когда изменения и изменения в компонентах производятся и сохраняются, страница обновляется и становится пустой, и в консоли нет ошибок.

Я смотрел на похожие проблемы, обнаруженные при переполнении стека, но проблемы другие и пока не нашли решения.

app-routing.module.ts:

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login/login.component';
import { NavigationComponent } from './navigation/navigation.component';
import { HomeComponent } from './home/home.component';
import { AuthguardService } from './authguard.service';
import { MembersComponent } from './members/members.component';
import { SubscriptionsComponent } from './subscriptions/subscriptions.component';
import { TicketsComponent } from './tickets/tickets.component';


export const routes: Routes = [
    { path: '', component: LoginComponent },
    {
        path: 'app-home', component: HomeComponent,
        canActivate: [AuthguardService],
        children: [
            { path: 'login', component: LoginComponent },
            { path: 'navigation', component: NavigationComponent },
            { path: 'member', component: MembersComponent },
            { path: 'subscription', component: SubscriptionsComponent },
            { path: 'ticket', component: TicketsComponent },
        ]
    },
    { path: '**', redirectTo: '' }
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }
export const routingComponents = [LoginComponent]

authguard.service.ts:

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';
import { LoginService } from './login.service';
@Injectable({
  providedIn: 'root'
})
export class AuthguardService implements CanActivate {
  constructor(private loginService: LoginService, private router: Router) { }
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
    boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
    const token = this.loginService.getToken();
    if (!token) {
      this.router.navigate(['/']);
      return false;
    }
    return true;
  }
}

Я ожидаю, что новые изменения будут видны сразу же, когда будут внесены новые изменения, вместо того, чтобы go возвращаться обратно на страницу входа, войдите снова и затем go вернитесь к компоненту, чтобы увидеть новые изменения.

Ответы [ 3 ]

0 голосов
/ 23 марта 2020

вы можете использовать это так

export const appRoutes : Routes=[
{ path : '' , component : HomeComponent},
{ path : '',
    runGuardsAndResolvers:'always',
    canActivate:[AuthGuard],
    children:[
        { path: 'members', component: MembersComponent },
        { path: 'member/edit', component: MemberEditComponent }
    ]
},

{ path : '**' , redirectTo : '' , pathMatch : 'full'}

];

0 голосов
/ 31 марта 2020

Спасибо всем за помощь и извините за ожидание! Но я наконец нашел ответ на свою проблему. Кажется, это опечатка, которую я сделал в самом начале ..

index. html:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Angular</title>
  <base href="./"

base href = "./" изменен на base href = "/"

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body class="body-app">
  <app-root></app-root>
</body>
</html>
0 голосов
/ 23 марта 2020

pathMatch: 'full'

Вам необходимо добавить pathMatch: 'full' к маршруту path: '', в противном случае Angular Маршрутизатор будет соответствовать ему при загрузке приложения, не интерпретируя все URL-адреса.

{ path: '', component: LoginComponent, pathMatch: 'full' },

По сути, pathMatch: 'full' означает, что весь URL-путь должен совпадать и используется алгоритмом сопоставления маршрутов.

Дублированный маршрут

Кроме того, у вас есть дублированный маршрут, указывающий на LoginComponent ... Я бы удалил маршрут app-home/login, который находится за AuthGuard, поскольку для доступа к нему необходимо войти в систему:

{ path: '', component: LoginComponent, pathMatch: 'full' },
{
    path: 'app-home', component: HomeComponent,
    canActivate: [AuthguardService],
    children: [
        { path: 'login', component: LoginComponent }, // <= remove this route
        { path: 'navigation', component: NavigationComponent },
        { path: 'member', component: MembersComponent },
        { path: 'subscription', component: SubscriptionsComponent },
        { path: 'ticket', component: TicketsComponent },
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...