【问题标题】:Angular 2 lazy loading redirecting to a blank pageAngular 2延迟加载重定向到空白页面
【发布时间】:2017-03-31 12:35:20
【问题描述】:

我更改了我的 Angular 2 脚本并创建了一个包含注册和登录页面组件的新功能模块:

import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { SignupComponent } from './signup/signup.component';
import { SigninComponent } from './signin/signin.component';
import { NotfoundComponent } from '../notfound/notfound.component';
import { ChildRoutingModule } from './auth.route';
@NgModule({
    declarations:[
        SignupComponent,
        SigninComponent,
        NotfoundComponent
    ],

    imports:[
        FormsModule,
        HttpModule,

        ChildRoutingModule
    ]
})

export class AuthModule{}

当然,我还创建了一个名为ChildRoutingModule 的子路由文件:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { SigninComponent } from './signin/signin.component';
import { SignupComponent } from './signup/signup.component';

const childRoutes: Routes = [
    {path: 'signup', loadChildren: './auth.module#AuthModule'},
    {path: 'signin', component: SigninComponent}

];

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild(childRoutes)
  ],
  exports:[RouterModule]
})
export class ChildRoutingModule { }

在这个路由文件中,我使用以下方法创建了一个延迟加载到主页:

{path: 'signup', loadChildren: './auth.module#AuthModule'},

正如您在 AuthModule 导出的类中看到的那样。

这里是父根模块:

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SigninComponent } from './auth/signin/signin.component';
import { SignupComponent } from './auth/signup/signup.component';
import { NotfoundComponent } from './notfound/notfound.component';
import { ChildRoutingModule } from './auth/auth.route';
import { HomeComponent } from './home/home.component';

const appRoutes: Routes = [
    //{path: '', redirectTo:'signup', pathMatch:'full'},
    {path: '', component: HomeComponent},

    {path: '**', component: NotfoundComponent}
];

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

这里是父模块app.module:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';

import {RouterModule} from '@angular/router';

import { AppComponent } from './app.component';
import { AuthModule } from './auth/auth.module';

import {AuthService} from './auth/auth.service';

import { AppRoutingModule } from './routes';
import { ChildRoutingModule } from './auth/auth.route';
import { HomeComponent } from './home/home.component';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent
  ],
  imports: [
    ChildRoutingModule,
    BrowserModule,
    AuthModule,
    RouterModule,
    AppRoutingModule,
    CommonModule

  ],
  providers: [AuthService],
  bootstrap: [AppComponent]
})
export class AppModule { }

我现在的问题是,当我点击主页组件中的注册按钮时:

<h1>Home Page</h1>
<button [routerLink]="['/signup']" type="button" class="btn btn-primary">Register</button>
<hr>
<button type="button" class="btn btn-primary">Login</button>

由于 home.component.ts 中没有脚本,我将重定向到具有正确链接的空白组件:

localhost:4200/注册

并且控制台没有错误。

P.S.:如果我输入 localhost:4200/singin,它会正常显示登录组件

【问题讨论】:

  • Sooo...AuthModule 有路由,其中​​一条路由延迟加载 AuthModule.. 将有路由.. 并且其中一条路由延迟加载 AuthModule.... ..你知道这是怎么回事:)
  • 是的,泰勒在他的回答中告诉我循环依赖
  • @PierreDuc 仍然无法解决

标签: angular lazy-loading


【解决方案1】:

在我看来你有一个循环依赖。

AuthModule 导入包含signup 路由的ChildRoutingModule 延迟加载到AuthModule。 这就是为什么signin 有效,而signup 无效,因为signup 是循环依赖。

编辑

为了解决这个问题,我会稍微改变一下你的路由。首先,我不会创建单独的NgModules 来保存路由配置。将路由配置添加到适当的模块。我还没有测试过这个确切的代码,但它应该看起来像这样:

//app.routes.ts

import { Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { NotfoundComponent } from './notfound/notfound.component';

export const ROUTES: Routes = [
    {path: '', component: HomeComponent},
    {path: 'signin', loadChildren: './auth/auth.module#AuthModule'},
    {path: '**', component: NotfoundComponent}
];

在您的 AppModule 中使用它:

// app.module.ts

import { ROUTES as appRoutes } from './app.routes';

...

imports: [
    ...
    RouterModule.forRoot(appRoutes)
],

然后为AuthModule 的路由配置做类似的事情:

//auth.routes.ts

import { Routes } from '@angular/router';
import { SigninComponent } from './signin/signin.component';
import { SignupComponent } from './signup/signup.component';

export const ROUTES: Routes = [
    {path: '', component: SigninComponent},
    {path: 'signup', loadChildren: './auth.module#AuthModule'}
];

并将其导入您的AuthModule

//auth.module.ts

import { ROUTES as authRoutes } from './auth.routes';

imports: [
    ...
    RouterModule.forChild(authRoutes)
]

这样,您的整个 AuthModule 将被延迟加载,并且您的网址与您的网址保持不变。

【讨论】:

  • 不。它没有像你解决的那样工作,我的行为仍然相同
  • 那么除了循环依赖之外,你肯定还有其他问题。再次检查您的模块并确保您的 AppModule 具有 BrowserModule(而不是 CommonModule),并且您的其他模块导入 CommonModule 而不是 BrowserModule。
猜你喜欢
  • 1970-01-01
  • 2017-08-23
  • 2019-01-08
  • 1970-01-01
  • 2016-03-25
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多