【问题标题】:Angular 6 routing redirectingAngular 6 路由重定向
【发布时间】:2018-12-27 04:25:43
【问题描述】:

我是 Angular 的新手,正在编写我的第一个 Angular 管理仪表板应用程序。

我必须设置两个布局

  1. 用于登录、注销、忘记密码等身份验证
  2. 登录后会出现管理仪表板

为此我设置了两个布局组件

  1. 管理布局
  2. 授权布局

并将所有的认证组件放入认证模块

我的应用程序的目录结构是这样的

app
|- e2e
|- node_modules
|- src
   |- app
      |- auth (module)
         |- login (component)
            |- login.component.ts
            |- login.component.html
         |- register (component)
            |- register.component.ts
            |- register.component.html
         |- auth.module.ts
      |- dashboard (component for auth users)
         |- dashboard.component.ts
         |- dashboard.component.html
      |- layouts ( directory)
         |- admin-layout (component)
            |- admin-layout.component.html
            |- admin-layout.component.ts
            |- admin-layout.module.ts
            |- admin-layout.routing.ts
         |- auth-layout (component)
            |- auth-layout.component.html
            |- auth-layout.component.ts
            |- auth-layout.module.ts
            |- auth-layout.routing.ts
      |- app.component.html
      |- app.component.ts
      |- app.module.ts
      |- app-routing.module.ts
   |- assets
   |- index.html

app-routing.module.ts的内容

import { NgModule } from '@angular/core';

import {AppRoutingModule} from './app-routing.module';
import { AppComponent } from './app.component';
import {FormsModule} from '@angular/forms';
import {RouterModule} from '@angular/router';
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
import {HttpClientModule} from '@angular/common/http';
import { AdminLayoutComponent } from './layouts/admin-layout/admin-layout.component';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {ComponentsModule} from './components/components.module';
import { AuthLayoutComponent } from './layouts/auth-layout/auth-layout.component';

@NgModule({
  declarations: [
    AppComponent,
    AdminLayoutComponent,
    AuthLayoutComponent
  ],
  imports: [
    BrowserAnimationsModule,
    FormsModule,
    HttpClientModule,
    RouterModule,
    AppRoutingModule,
    NgbModule.forRoot(),
    ComponentsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app-routing.module.ts的内容

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import {AdminLayoutComponent} from './layouts/admin-layout/admin-layout.component';
import {CommonModule} from '@angular/common';
import {BrowserModule} from '@angular/platform-browser';
import {AuthLayoutComponent} from './layouts/auth-layout/auth-layout.component';

const routes: Routes = [
  { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
  { path: '', component: AdminLayoutComponent, children: [
      {path: '', loadChildren: './layouts/admin-layout/admin-layout.module#AdminLayoutModule'}
    ] },
  { path: '', component: AuthLayoutComponent, children: [
      {path: '', loadChildren: './layouts/auth-layout/auth-layout.module#AuthLayoutModule'}
    ]}
];

@NgModule({
  imports: [
    CommonModule,
    BrowserModule,
    RouterModule.forRoot(routes)
  ],
  exports: [
    RouterModule
  ]
})
export class AppRoutingModule { }

admin-layout.routing.ts

的内容
import { Routes } from '@angular/router';
import {DashboardComponent} from '../../dashboard/dashboard.component';

export const AdminLayoutRoutes: Routes = [
  { path: 'dashboard', component: DashboardComponent}
];

admin-layout.module.ts的内容

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { FormsModule } from '@angular/forms';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';

import { AdminLayoutRoutes } from './admin-layout.routing';
import { DashboardComponent } from '../../dashboard/dashboard.component';
import { IconsComponent } from '../../icons/icons.component';
import {ChartsModule} from 'ng2-charts';

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild(AdminLayoutRoutes),
    FormsModule,
    ChartsModule,
    NgbModule
  ],
  declarations: [
    DashboardComponent,
    IconsComponent
  ]
})
export class AdminLayoutModule { }

auth-layout.module.ts

的内容
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {RouterModule} from '@angular/router';
import {AuthLayoutRoutes} from './auth-layout.routing';
import {FormsModule} from '@angular/forms';
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
import {AuthModule} from '../../auth/auth.module';
import {LoginComponent} from '../../auth/login/login.component';
import {RegisterComponent} from '../../auth/register/register.component';

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild(AuthLayoutRoutes),
    FormsModule,
    NgbModule,
    AuthModule
  ],
  declarations: [
    LoginComponent,
    RegisterComponent
  ]
})
export class AuthLayoutModule { }

auth-layout.routing.ts

的内容
import {Routes} from '@angular/router';
import {LoginComponent} from '../../auth/login/login.component';
import {RegisterComponent} from '../../auth/register/register.component';
import {ForgotPasswordComponent} from '../../auth/forgot-password/forgot-password.component';
import {ResetPasswordComponent} from '../../auth/reset-password/reset-password.component';

export const AuthLayoutRoutes: Routes = [
  {path: 'login', component: LoginComponent},
  {path: 'register', component: RegisterComponent},
  {path: 'forgot-password', component: ForgotPasswordComponent},
  {path: 'reset-password', component: ResetPasswordComponent}
];

问题

在访问localhost:4200 时,会重定向到localhost:4200/dashboard,并且它的工作方式是在管理员路由中设置dashboard 路径。

但是在访问 localhost:4200/login 时会重定向到 localhost:4200 并且登录路由无法通过身份验证路由工作。

应用代码网址:https://stackblitz.com/edit/angular-lwevqj
应用网址:https://angular-lwevqj.stackblitz.io

【问题讨论】:

    标签: angular angular-routing


    【解决方案1】:

    它重定向到/dashboard,因为您的全局路由文件在顶部定义了将任何调用重定向到仪表板组件。

    查看全局路由文件中的第一个 path 定义

    在这个有角度的项目中,层次结构是建立起来的。假设用户将首先进入仪表板。

    如果您想直接进入登录组件,只需在全局路由文件中为登录组件路由添加/login

    但请注意登录模块中的路由。我建议仅当您真的想要拥有该依赖 url 时才使用 /child1/child2 形式的子路由。

    如果你想让你的一些组件成为 /name 的形式,它们应该是全局存在的。

    你可以在Angular 6 Docs看到更多

    【讨论】:

      【解决方案2】:

      您正在使用此代码 { path: '', redirectTo: 'dashboard', pathMatch: 'full' } (app-routing.module.ts) 文件等访问 localhost:4200 将重定向到 localhost:4200/dashboard,它可以用作仪表板。

      首先设置您的默认路径位置,如 { path: '', redirectTo: 'login', pathMatch: 'full' } 如果您将使用此代码,那么当您输入 localhost:4200 时,您的 url 会自动重定向到登录组件。

      【讨论】:

      • 我明白,但为什么在访问/login 时重定向到/?除了/dashboard,没有定义重定向路径。所以即使它重定向,它也应该重定向到/dashboard
      • 那么你能告诉我默认重定向路由在哪里吗?
      • 并告诉我你想在哪里导航你的路线(路径)?
      【解决方案3】:

      你的路线应该像 -

      const routes: Routes = [
        { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
        { path: 'admin', component: AdminLayoutComponent, children: [
            {path: '', loadChildren: './layouts/admin-layout/admin-layout.module#AdminLayoutModule'}
          ] },
        { path: 'auth', component: AuthLayoutComponent, children: [
            {path: '', loadChildren: './layouts/auth-layout/auth-layout.module#AuthLayoutModule'}
          ]}
      ];
      

      您的身份验证路线也应该像 -

      export const AuthLayoutRoutes: Routes = [
        {path: '', component: LoginComponent},
        {path: 'register', component: RegisterComponent},
        {path: 'forgot-password', component: ForgotPasswordComponent},
        {path: 'reset-password', component: ResetPasswordComponent}
      ];
      

      电话应该是 -

      登录 - localhost:4200/auth/login 注册 - localhost:4200/auth/register 其他人也一样

      【讨论】:

      • 我不能在没有任何前缀的情况下路由到loginregiter 吗?表示直接在/login/register 而不是/login/register?
      • 实际上你必须在你的应用模块路由中区分你的路由,否则它总是会去第一个匹配
      • 我建议使用/auth/login/auth/register 这样会更好。
      • 我明白,但由于前两条路径最初在 `` 监听时是相同的,那么为什么它不适用于第三条路径。此外,即使它不起作用,为什么要重定向? admin route 中没有重定向路径。
      • { path: '', redirectTo: 'dashboard', pathMatch: 'full' },这是在寻找完全匹配的路径,所以如果你喜欢它,它会排在第二位。本地主机:4200/abc。您可以尝试改组 admin 和 auth , auth 可以工作,但 admin 不应该。
      【解决方案4】:

      你应该改变你的主要路线(将''替换为'login'),我认为问题出在:

      const routes: Routes = [
        { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
        { path: '', component: AdminLayoutComponent, children: [
            {path: '', loadChildren: './layouts/admin-layout/admin-layout.module#AdminLayoutModule'}
          ] },
        { path: 'login', component: AuthLayoutComponent, children: [
            {path: '', loadChildren: './layouts/auth-layout/auth-layout.module#AuthLayoutModule'}
          ]}
      ];
      

      【讨论】:

        猜你喜欢
        • 2017-08-10
        • 2014-05-09
        • 1970-01-01
        • 2019-02-18
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多