Angular 无法读取属性';loadChildren';空的

Angular 无法读取属性';loadChildren';空的,angular,angular-cli,Angular,Angular Cli,我正在将一个项目转换为使用angular cli,一切都正常(一旦构建完成),但在构建过程中我有一个奇怪的行为 使用ng发球 我总是在第一次尝试时遇到此错误:无法读取null的属性“loadChildren”中的错误 使用ng build时会抛出相同的错误 但是如果我使用ng build——请注意 在第一次构建失败后,我编辑一个文件以再次触发构建,它将成功。我对ng build-prod-watch也有同样的行为 有没有办法第一次就把建筑做好 请注意,我的项目中没有任何子路由/模块,我也没有任何

我正在将一个项目转换为使用angular cli,一切都正常(一旦构建完成),但在构建过程中我有一个奇怪的行为

使用
ng发球
我总是在第一次尝试时遇到此错误:无法读取null的属性“loadChildren”中的错误

使用
ng build时
会抛出相同的错误

但是如果我使用
ng build——请注意

在第一次构建失败后,我编辑一个文件以再次触发构建,它将成功。我对
ng build-prod-watch也有同样的行为

有没有办法第一次就把建筑做好

请注意,我的项目中没有任何子路由/模块,我也没有任何其他输出来查看导致此问题的原因

更新:使用子路由进行测试,我仍然得到相同的行为

更新:将@angular libs从4.0.0降级到2.4.0,我仍然得到完全相同的行为,但有不同的错误消息


AppModule中的错误不是NgModule

我的路由有多个ts文件,我所做的是在我的app.routes中导入所有这些路由,然后将它们全部合并以调用forRoot:

export const appRoutes=xRoutes.concat(zRoutes)
etc


在将所有路由放在一个file/export-const语句中之后,错误/奇怪的构建行为消失了。

我在Angular CLI v1.6中也遇到了类似的问题

在我的例子中,我没有使用
.concat()
或任何其他类型的路由器定义的动态操作

相反,我在路由的数据属性中有一个函数,它是一个匿名箭头函数。将其更改为命名的导出函数为我解决了这个问题

之前:

 {
    path: ':id',
    component: ProductDetailComponent,
    data: {
        breadcrumb: (data: any, params: any) => {
            let id = params['id'];
            return id === 'create' ? 'New Product' : data.product.ShortDescription;
        }
    }
}
之后:

{
    path: ':id',
    component: ProductDetailComponent,
    data: { breadcrumb: getBreadcrumb }
}

export function getBreadcrumb(data: any, params: any): string {
    let id = params['id'];
    return id === 'create' ? 'New Product' : data.product.ShortDescription;
}
模拟、组件和路由守卫
另一件需要检查的事情是,您是否在路由声明中为虚拟组件模拟/存根任何类。模拟路由器守卫似乎也会发生这种情况。

这可能是由于您的项目中的一些语法错误,使用

ng构建--prod--aot


获取更详细的错误消息。

我在为我的应用程序提供服务后遇到此问题,并通过在一个甚至未处于编辑/未保存状态的文件中按Ctrl+s解决了此问题。现在它在没有警告的情况下编译。然而,让它第一次编译是非常奇怪的事情

TS/NG编译器无法接受在变量中存储对象实例并将该变量设置为我的[lazyLoaded]路由的
数据。但是,直接在路由的
数据
属性上实例化对象是可以接受的


我清楚地知道,上述任何一项都没有任何直观的意义,但我希望这可以节省一些人自己查找这些内容所需的时间。

为了完整性:我在从相关对象列表创建路由时遇到了这个问题:

从'@angular/core'导入{NgModule};
从'@angular/router'导入{RouterModule,Route};
从“./dashboard/dashboard.component”导入{DashboardComponent};
从“/EXAMPLES list”导入{EXAMPLES,Example};
常数路由=[
…EXAMPLES.map(toRoute),//此行产生了错误
{路径:'',重定向到:'/dashboard',路径匹配:'full'},
{路径:'dashboard',组件:DashboardComponent},
{路径:'**',重定向到:'/dashboard',路径匹配:'full'}
];
@NGD模块({
导入:[RouterModule.forRoot(路由)],
导出:[路由模块]
})
导出类AppRoutingModule{}
//`export`ing此函数修复了错误
导出函数toRoute(例如):路由{
返回{
路径:例如路径,
组件:例如组件,
数据:{title:ex.title}
};
}
我必须将在
map()
/code>中使用的函数修复我的错误

如果它被删除,修复程序将更改以下内容:

export const ROUTES=MY_ROUTES.map(TO_ANGULAR_ROUTE)
为此:

export const ROUTES=[];
路线。推(…我的路线。地图(到路线));

在我的例子中,当我尝试将一个路由阵列连接到另一个路由阵列时,我遇到了这样的问题:

export const businesslogicState: Routes = BUSINESSLOGIC_ROUTES.concat(gamesRoutes);
concat的每个部分都是路线[]


将单元素数组gamesRoutes更改为Route对象本身没有帮助,仍然会出现相同的错误。

我也有相同的错误,但我的要求是将所有路由都放在一个单独的文件中。我通过简单地导出我的路线[]解决了这个问题,如下所示:

export const routes: Routes = [
 // ... all my route objects
];

当路由名称未遵循camelCase命名标准时,会出现此问题。我为模块取了
dsar config
名称,当我将其更改为
dsarConfig
时,我没有得到任何编译错误。

我得到这个错误是由于路由中的双逗号,如下所示


在我的例子中,它的出现是因为相同的路由路径添加了两次,以加载两个不同的组件,如下所示

{
   path: '', redirectTo: 'pageone', pathMatch: 'full'
},
{
   path: 'pageone',
   component: PageOneComponent
},
{
   path: '',
   children: [
  ...['PageTwoPartOne', 'PageTwoPartTwo', 'PageTwoPartOneQuickReference'].map(path => ({
      path,
      component: PageTwoComponent
    }))
   ]
},

更正其中一条路径(路径:'')后,它对我有效。

您看过这个吗?您正在使用导出默认值吗?还有,您使用的是哪个版本的cli?是的,我确实在github上看到了这个问题。但是,我不使用导出默认值。我不认为这可以解释这种行为,因为使用导出默认值总是会导致生成失败,你不这样认为吗?嗯,你是否尝试过卸载cli并重新安装它<代码>npm卸载-g@angular/cli
然后重新安装。在您的应用程序中,删除
node\u模块
文件夹,然后
npm安装
再次尝试
ng serve
。此外,可能值得尝试运行项目的本地cli,而不是全局cli。您可以通过运行
npm start
来实现这一点,它实际上将调用
scripts
中的
start
脚本。json
如果这不起作用,请发布您的路由器配置here@Ahmed不确定你想看什么?我有默认的RouterMod
{
   path: '', redirectTo: 'pageone', pathMatch: 'full'
},
{
   path: 'pageone',
   component: PageOneComponent
},
{
   path: '',
   children: [
  ...['PageTwoPartOne', 'PageTwoPartTwo', 'PageTwoPartOneQuickReference'].map(path => ({
      path,
      component: PageTwoComponent
    }))
   ]
},