我对Angular项目的路由存在一些问题,主要是第三级子路由。在应用程序上导航时,这些路线完美地工作。 (routerLink
),通过浏览器网址访问网址时出现问题。
My Angular版本是2.4.0
我正在使用ng serve
在开发服务器上进行测试。
对于具有给定结构的项目,
.
├── photos
├── posts
├── users
│ ├── detail
│ │ ├── address
│ │ ├── family
│ │ ├── information
│ │ └── phones
│ ├── friends
│ └── profile
└── videos
以下是代码,
// user routes
export const userRoutes : Routes = [
{
path: 'detail',
component: DetailComponent
},
{
path: 'friends',
component: FriendsComponent
},
{
path: 'profile',
component: ProfileComponent
}
]
//app routes
const appRoutes: Routes = [
{
path: '',
component: HomeComponent
},
{
path: 'photos',
component: PhotosComponent
},
{
path: 'posts',
component: PostsComponent
},
{
path: 'users',
component: UserListComponent
},
{
path: 'user/:username',
component: UserComponent,
children: userRoutes
},
{
path: 'videos',
component: VideosComponent
}
]
export const AppRoutes = RouterModule.forRoot(appRoutes);
export const appRoutingProviders: any[] = [];
并注册为,
@NgModule({
declarations: [
// declarations
],
imports: [
AppRoutes
],
providers: [
appRoutingProviders
],
bootstrap: [AppComponent]
})
export class AppModule { }
因此,应用程序适用于RouterLink
[routerLink]="['/user', username, 'detail']
但是当我浏览浏览器<host>/user/myuser/detail
时,它会引发异常
Uncaught (in promise): Error: Cannot find primary outlet to load 'DetailComponent'
什么错了?感谢。
注意:我已经设置<router-outlet>
并且在routerLink上工作正常,当浏览器中的完整网址导航时会出现问题。
答案 0 :(得分:5)
我假设当您从user/:username/
导航到/user/:username/detail
时,您需要UserComponent
隐藏模板上的所有内容并显示DetailComponent
因此,要实现这一目标,您需要一个将加载其子组件的组件:
<强> parent.component.html 强>
<router-outlet></router-outlet>
<强> routes.ts 强>
现在让我们设置路由,以便user/:username/
加载到父组件
// user routes
export const userRoutes : Routes = [
{
path: '',
component: UserComponent // the '' path will load UserComponent
},
{
path: 'detail',
component: DetailComponent
},
{
path: 'friends',
component: FriendsComponent
},
{
path: 'profile',
component: ProfileComponent
}
]
//app routes
const appRoutes: Routes = [
{
path: '',
component: HomeComponent
},
{
path: 'photos',
component: PhotosComponent
},
{
path: 'posts',
component: PostsComponent
},
{
path: 'users',
component: UserListComponent
},
{
path: 'user/:username',
component: ParentComponent, //This component will load its children
children: userRoutes
},
{
path: 'videos',
component: VideosComponent
}
]
export const AppRoutes = RouterModule.forRoot(appRoutes);
export const appRoutingProviders: any[] = [];
所以,这里发生的事情是当你导航到user/:username
ParentComponent
时加载了UserComponent
加载到父组件的出口(因为''
路径对应于{ {1}})
以下是一个有效的示例: Github
当您访问user/:username
时,它将显示:用户正常工作!
user/myuser
将显示:详细信息有效!如下所示(不使用routerlink)
答案 1 :(得分:0)
您是否设置了<base href="/">?
你的后端是什么?如果用户首先导航到应用程序子页面的完整URL(例如www.mysite.com/users/john-doe),并且您的后端没有返回角度2引导页面(index.html带有引导脚本) ,然后角度路由器将永远不会启动,虽然我认为这不是你的情况下的问题,因为你从角度获得错误。
我的.net核心后端设置为始终为非静态文件的请求返回index.html,因此它始终正确加载应用程序并使用角度路由。
答案 2 :(得分:0)
在标签内使用<base href="/">
。
注意 <base href="/">
,它应该位于head标签顶部。
<head>
<base href="/">
other css and jquery ...
</head>
路由
const appRoutes: Routes = [
{
path: 'Admin',
component: AdminComponent,
children: [
{
path: 'CandidateInfo',
component: CandidateInfoComponent
},
{
path: 'RptCandidateInfo',
component: RptCandidateInfoComponent
},
{
path: 'RptCandidateInfoDT',
component: RptCandidateDTInfoComponent
}
]
},
];
运行正常。
答案 3 :(得分:-3)
在html routerLink =“/ user”中使用此代码,请在routing.ts中提及您的路径,当您单击此路由器链接时,它将跳转到相关链接