angular6功能模块延迟加载抛出错误TypeError:undefined不是函数

Abi*_*tra 28 angular angular6

我有这个代码app-routing.module.ts,根据角度的新文档,我通过该方法仍然没有工作,抛出一些我无法理解的错误.

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from "@angular/router";
import { HomeComponent } from "./home/home.component";
import { AdminModule } from "./admin/admin.module";

const routes: Routes = [
  {
    path: 'admin',
    loadChildren: './admin/admin.module#AdminModule'
  },
  { path: '', redirectTo: '/home', pathMatch: 'full' },
  { path: 'home', component: HomeComponent },
];

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forRoot(routes)
  ],
  exports: [
    RouterModule
  ],
  declarations: []
 })
 export class AppRoutingModule { }
Run Code Online (Sandbox Code Playgroud)

它抛出这样的错误.

我也试过像这样的旧方式'app/admin/admin.module#AdminModule'.但它仍然无法正常工作.

core.js:1601 ERROR Error: Uncaught (in promise): TypeError: undefined is not a function
TypeError: undefined is not a function
    at Array.map (<anonymous>)
    at webpackAsyncContext ($_lazy_route_resource lazy namespace object:18)
    at SystemJsNgModuleLoader.push../node_modules/@angular/core/fesm5/core.js.SystemJsNgModuleLoader.loadAndCompile (core.js:5569)
    at SystemJsNgModuleLoader.push../node_modules/@angular/core/fesm5/core.js.SystemJsNgModuleLoader.load (core.js:5561)
    at RouterConfigLoader.push../node_modules/@angular/router/fesm5/router.js.RouterConfigLoader.loadModuleFactory (router.js:3294)
    at RouterConfigLoader.push../node_modules/@angular/router/fesm5/router.js.RouterConfigLoader.load (router.js:3282)
    at MergeMapSubscriber.project (router.js:1479)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:117)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._next (mergeMap.js:107)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:93)
    at Array.map (<anonymous>)
    at webpackAsyncContext ($_lazy_route_resource lazy namespace object:18)
    at SystemJsNgModuleLoader.push../node_modules/@angular/core/fesm5/core.js.SystemJsNgModuleLoader.loadAndCompile (core.js:5569)
    at SystemJsNgModuleLoader.push../node_modules/@angular/core/fesm5/core.js.SystemJsNgModuleLoader.load (core.js:5561)
    at RouterConfigLoader.push../node_modules/@angular/router/fesm5/router.js.RouterConfigLoader.loadModuleFactory (router.js:3294)
    at RouterConfigLoader.push../node_modules/@angular/router/fesm5/router.js.RouterConfigLoader.load (router.js:3282)
    at MergeMapSubscriber.project (router.js:1479)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:117)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._next (mergeMap.js:107)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:93)
    at resolvePromise (zone.js:814)
    at resolvePromise (zone.js:771)
    at zone.js:873
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.js:4062)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:420)
    at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:188)
    at drainMicroTaskQueue (zone.js:595)
    at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:500)
    at invokeTask (zone.js:1540)
Run Code Online (Sandbox Code Playgroud)

yoe*_*ver 39

我有同样的问题,我的原因是我在我的应用程序模块中导入延迟加载的模块.

  • 同样在这里.我最初将一个功能模块导入到我的app模块中,然后阅读有关延迟加载和编辑路由但忘记删除import语句的内容.错误消息"未定义不是函数"至少没有帮助. (2认同)

小智 8

在运行ng serve时重新编译后会引发此错误,此后始终显示。 重新启动服务-解决了这个问题。

重要!

使用loadChildren作为函数- 不是延迟加载:

{path: 'admin', loadChildren:() => AdminModule } //not lazy loading
Run Code Online (Sandbox Code Playgroud)

因为您需要在路由模块中导入惰性模块。

对于延迟加载,必须将路径发送到延迟模块-作为String

{path: 'admin', loadChildren:'app/admin/admin.module#AdminModule'} // This is lazy loading
Run Code Online (Sandbox Code Playgroud)


sha*_*ain 8

在使用Angular-7和Angular CLI:7.1.3时,我也遇到了相同的问题,并试图找到一些解决方案。通过从app.module文件中删除延迟加载的模块的import语句,为我解决了此问题。

// remove this from app.module and app-routing.module file and it will work fine
import { AdminModule } from "./admin/admin.module";
Run Code Online (Sandbox Code Playgroud)

我的项目配置供参考


Abi*_*tra -6

{path: 'admin', loadChildren:() => AdminModule }
Run Code Online (Sandbox Code Playgroud)

尝试这个。这就是问题的解决方案

  • 虽然这确实有效,但我非常确定这实际上不再是延迟加载,因为要编译此代码,您必须预先导入 AdminModule 并对模块进行硬引用 (3认同)
  • 这是可行的,但这也会禁用延迟加载。在我看来,这个问题不是一个有效的答案。 (2认同)
  • 这个解决方案没有任何意义。如果你使用这个想法,你就会失去这个模块的延迟加载...... (2认同)