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