无法匹配任何路由。 URL 段:同时使用多个路由器出口

Posted

技术标签:

【中文标题】无法匹配任何路由。 URL 段:同时使用多个路由器出口【英文标题】:Cannot match any routes. URL Segment: while using multiple router-outlet 【发布时间】:2019-02-18 04:29:36 【问题描述】:

我是角度方面的新手。我正在创建一个 Angular 6 的门户 Web 应用程序。

这个项目有一个登录表单和一些用户环境页面。在用户环境中,页眉、页脚和侧边菜单在所有页面之间是通用的,但这些在登录页面中不可见。因此,我决定为此分配两个具有不同名称的<router-outlet> 标签。

我在 app.component.html 中的代码如下:

<div class="container-fluid">
  <router-outlet name="without_header_and_footer"></router-outlet>
  <router-outlet name="admin_panel"></router-outlet>
</div>

之后,我创建了两个名为 AuthGuardServiceGuestGuardService 的身份验证服务,它们控制对登录表单和用户环境页面的访问。

这两个服务代码如下:

auth-guard.service.ts

export class AuthGuardService implements CanActivate , CanActivateChild
  constructor(private authService: AuthService , private router: Router)  

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
    Observable<boolean>
    | Promise<boolean>
    | boolean 
return this.authService.isLogin().then((isLogin) => 
  if(isLogin)
    return true;
  
  this.router.navigate([
    
      outlets: 
        without_header_and_footer: ['']
      
    
  ]);
);
  

  canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot):
    Observable<boolean>
    | Promise<boolean>
    | boolean 
    return this.canActivate(childRoute , state);
  

guest-guard.service.ts

export class GuestGuardService implements CanActivate , CanActivateChild
  constructor(private authService: AuthService , private router: Router)  

  canActivate(route: ActivatedRouteSnapshot, state: 
RouterStateSnapshot):
    Observable<boolean>
    | Promise<boolean>
    | boolean 
return this.authService.isLogin().then((isLogin) => 
  if(!isLogin)
    return true;
  
  this.router.navigate([
    
      outlets: 
        admin_panel: ['home']
      
    
  ]);
);
  

  canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<boolean>
| Promise<boolean>
| boolean 
return this.canActivate(childRoute , state);
  

authService 这两个类的构造函数中注入的变量是从 AuthService 类中实例化的,如下所示:

auth.service.ts

export class AuthService 
  loggedIn: boolean = false;
  constructor()  

  isLogin()
const promise = new Promise((resolve , reject) => 
  setInterval(() => 
    return resolve(this.loggedIn);
   , 1000);
);
return promise;
  

  login()
    this.loggedIn = true;
  

  logout(): void
    this.loggedIn = false;
  

app.modules.ts

import  BrowserModule  from '@angular/platform-browser';
import  NgModule  from '@angular/core';
import  NO_ERRORS_SCHEMA  from '@angular/core';
import  MDBBootstrapModule  from 'angular-bootstrap-md';
import  AppComponent  from './app.component';
import  LoginComponent  from './components/login/login.component';
import AppRouting from './app-routing';
import  HomeComponent  from './components/home/home.component';
import AuthGuardService from "./services/auth/auth-guard.service";
import GuestGuardService from "./services/auth/guest-guard.service";
import AuthService from "./services/auth/auth.service";
import FormsModule, ReactiveFormsModule from "@angular/forms";
@NgModule(
  declarations: [
    AppComponent,
    LoginComponent,
    HomeComponent
  ],
  imports: [
    BrowserModule,
    MDBBootstrapModule.forRoot(),
    FormsModule,
    ReactiveFormsModule,
    AppRouting
  ],
  schemas: [ NO_ERRORS_SCHEMA ],
  providers: [
    AuthGuardService,
    GuestGuardService,
    AuthService
  ],
  bootstrap: [AppComponent]
)
 export class AppModule  

app-routing.ts

import NgModule from '@angular/core';
import RouterModule, Routes from '@angular/router';
import LoginComponent from './components/login/login.component';
import HomeComponent from "./components/home/home.component";
import AuthGuardService from "./services/auth/auth-guard.service";
import GuestGuardService from "./services/auth/guest-guard.service";

const appRoutes: Routes = [
  
    path: '',
    pathMatch: 'full',
    component: LoginComponent ,
    outlet: 'without_header_and_footer',
    canActivate: [GuestGuardService],
  ,
  
    path: 'home',
    component: HomeComponent,
    outlet: 'admin_panel',
    canActivate: [AuthGuardService]
  
];

@NgModule(
  imports: [
    RouterModule.forRoot(appRoutes)
  ],
  exports: [
    RouterModule
  ]
)
export class AppRouting 

最后我的路线如下:

const appRoutes: Routes = [
  
    path: '',
    pathMatch: 'full',
    component: LoginComponent ,
    outlet: 'without_header_and_footer',
    canActivate: [GuestGuardService],
  ,
  
    path: 'home',
    component: HomeComponent,
    outlet: 'admin_panel',
    canActivate: [AuthGuardService]
  
];

似乎每件事都是正确的。但是当我想导航到路由 /home 时,控制台中会显示以下错误:

core.js:1673 ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'home' Error: Cannot match any routes. URL Segment: 'home'

【问题讨论】:

您能否发布您的应用模块代码以及您如何导航到家? 我被添加了app.module.ts文件内容。 你还没有在Router模块中注册你的路由。 我在浏览器地址栏输入了localhost:4200/home 我在 AppRouting 文件中注册了它们并在 app.module.ts 的导入部分中导入了它 【参考方案1】:

将您的 aap.routing.ts 文件更改为:

import LoginComponent from './components/login/login.component';
import HomeComponent from "./components/home/home.component";
import AuthGuardService from "./services/auth/auth-guard.service";
import GuestGuardService from "./services/auth/guest-guard.service";

export const appRoutes: Routes = [
  
    path: '',
    pathMatch: 'full',
    component: LoginComponent ,
    outlet: 'without_header_and_footer',
    canActivate: [GuestGuardService],
  ,
  
    path: 'home',
    component: HomeComponent,
    outlet: 'admin_panel',
    canActivate: [AuthGuardService]
  
];

然后在你的 app.module.ts 文件中像这样导入 appRoutes:

import  appRoutes  from './app.routing.ts'

并将您的导入数组替换为:

imports: [
    BrowserModule,
    MDBBootstrapModule.forRoot(),
    FormsModule,
    ReactiveFormsModule,
    RouterModule.forRoot(appRoutes)
  ]

【讨论】:

以上是关于无法匹配任何路由。 URL 段:同时使用多个路由器出口的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法匹配任何路由。网址段:

Angular 8嵌套路由和多个路由器插座不起作用

当 URL 不匹配任何路由并且 URL 包含 /#/ 时如何使用 ReactJS 显示 404

Django 路由 urls.py

Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词

ZF2路由器无法进行分段