默认情况下使第一个选项卡处于活动状态
Make first tab active by default
我正在使用以下 html 片段。
1.) 如何使常规选项卡默认处于活动状态。我尝试添加活动 class 但不知何故第一个每次都只活动。
2.) 单击选项卡后,如果我重新加载页面,则会出现以下错误,并且整个页面似乎都中断了。 url 回落到基础 url
EXCEPTION: Uncaught (in promise): Error: Cannot find primary outlet to load 'DataConfigurationGeneralDetailComponent'
Error: Cannot find primary outlet to load 'DataConfigurationGeneralDetailComponent'
HTML
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item"><a class="nav-link"
data-toggle="tab"
[routerLink]="['general']" [routerLinkActive]="['active']"
role="tab" dpTranslate="dataconfiguration.tabs.general">General</a></li>
<li class="nav-item"><a class="nav-link" data-toggle="tab"
[routerLink]="['mapping']" [routerLinkActive]="['active']"
dpTranslate="dataconfiguration.tabs.mappings">Mappings</a></li>
<li class="nav-item"><a class="nav-link" data-toggle="tab"
[routerLink]="['target']" [routerLinkActive]="['active']"
dpTranslate="dataconfiguration.tabs.target">Target</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<router-outlet></router-outlet>
</div>
路线
export const tenantRoute: Route[] = [
{
path: 'tenant',
component: TenantComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'tenant.home.title'
},
children: [
{
path: ':id',
component: TenantDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'tenant.home.title'
},
},
{
path: ':id/dataconfiguration/:id',
component: DataConfigurationDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
},
children: [
{
path: 'general',
component: DataConfigurationGeneralDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'mapping',
component: DataConfigurationMappingDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'target',
component: DataConfigurationTargetDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
}
]
}
]
}
];
这不是在模板中完成的,而是在路由配置中完成的。
默认情况下您需要重定向到常规选项卡:
{ path: ':id', component: MyPageComponent, children: [
{ path: '', redirectTo: 'general', pathMatch: 'full' },
{ path: 'general', component: MyGeneralTabComponent },
]},
在你的情况下,这意味着当你导航到“/tenant/123/dataconfiguration/456/”时,你将被自动重定向到“/tenant/123/dataconfiguration/456/general”,并且路由将在你的router-outlet.
编辑:您的路由配置似乎有问题,您重新定义了:id,它已经在父级别定义了一次。
{
path: 'dataconfiguration/:id', // remove first :id, it's already defined in parent route
component: DataConfigurationDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
},
children: [
// Add default redirect here
{ path: '', redirectTo: 'general', pathMatch: 'full' },
{
path: 'general',
component: DataConfigurationGeneralDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'mapping',
component: DataConfigurationMappingDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'target',
component: DataConfigurationTargetDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
}
]
}
更新: 更新了路由示例以解决对答案的评论。
要回答您的第一个问题,要使常规选项卡始终成为默认选项卡,您可以将“catch all( * )”路由设置为指向常规选项卡组件.
请参阅此处了解 routerLinkActive
指令的用法:https://angular.io/docs/ts/latest/api/router/index/RouterLinkActive-directive.html
要解决您的第二个问题,请确保您在 app.module.ts
:
中使用正确的导入
import { Routes, RouterModule } from '@angular/router';
并且您正在使用 forRoot,例如
export const routing = RouterModule.forRoot(routesArrayGoesHere)
--更新内容
一个简单的路由配置示例如下所示。
path: ''
是 url 当没有定义参数时,这是您希望用来首先加载常规选项卡的路径,因此您可以将其指向 'general tab'零件。
从技术上讲,path: '**'
路线是找不到路线时的全部,在这种情况下,我会转到错误页面。
const APP_ROUTES: Routes = [
{ path: 'dashboard', component: DashboardComponent },
{ path: '', component: DashboardComponent },
{ path: '**', component: PageNotFoundComponent }
]
您通过在其中嵌套子项使路由变得更加复杂。我建议先让您的路由使用平坦路径,然后再进行试验。 IE。
需要注意的一件事,我使用了 Routes,而不是 Route[](可能是同一件事,但如果仍然有,可以尝试改变问题)。
export const tenantRoute: Route[] = [
{ path: 'tenant', component: TenantComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'tenant.home.title' },
},
{ path: 'tenant:id', component: TenantDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'tenant.home.title' },
},
{ path: 'tenant:id/dataconfiguration/:id', component: DataConfigurationDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
},
{ path: 'tenant:id/dataconfiguration/:id/general', component: DataConfigurationGeneralDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
},
{ path: 'tenant:id/dataconfiguration/:id/mapping', component: DataConfigurationMappingDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
},
{ path: 'tenant:id/dataconfiguration/:id/target', component: DataConfigurationTargetDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
}
];
我正在使用以下 html 片段。
1.) 如何使常规选项卡默认处于活动状态。我尝试添加活动 class 但不知何故第一个每次都只活动。
2.) 单击选项卡后,如果我重新加载页面,则会出现以下错误,并且整个页面似乎都中断了。 url 回落到基础 url
EXCEPTION: Uncaught (in promise): Error: Cannot find primary outlet to load 'DataConfigurationGeneralDetailComponent'
Error: Cannot find primary outlet to load 'DataConfigurationGeneralDetailComponent'
HTML
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item"><a class="nav-link"
data-toggle="tab"
[routerLink]="['general']" [routerLinkActive]="['active']"
role="tab" dpTranslate="dataconfiguration.tabs.general">General</a></li>
<li class="nav-item"><a class="nav-link" data-toggle="tab"
[routerLink]="['mapping']" [routerLinkActive]="['active']"
dpTranslate="dataconfiguration.tabs.mappings">Mappings</a></li>
<li class="nav-item"><a class="nav-link" data-toggle="tab"
[routerLink]="['target']" [routerLinkActive]="['active']"
dpTranslate="dataconfiguration.tabs.target">Target</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<router-outlet></router-outlet>
</div>
路线
export const tenantRoute: Route[] = [
{
path: 'tenant',
component: TenantComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'tenant.home.title'
},
children: [
{
path: ':id',
component: TenantDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'tenant.home.title'
},
},
{
path: ':id/dataconfiguration/:id',
component: DataConfigurationDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
},
children: [
{
path: 'general',
component: DataConfigurationGeneralDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'mapping',
component: DataConfigurationMappingDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'target',
component: DataConfigurationTargetDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
}
]
}
]
}
];
这不是在模板中完成的,而是在路由配置中完成的。
默认情况下您需要重定向到常规选项卡:
{ path: ':id', component: MyPageComponent, children: [
{ path: '', redirectTo: 'general', pathMatch: 'full' },
{ path: 'general', component: MyGeneralTabComponent },
]},
在你的情况下,这意味着当你导航到“/tenant/123/dataconfiguration/456/”时,你将被自动重定向到“/tenant/123/dataconfiguration/456/general”,并且路由将在你的router-outlet.
编辑:您的路由配置似乎有问题,您重新定义了:id,它已经在父级别定义了一次。
{
path: 'dataconfiguration/:id', // remove first :id, it's already defined in parent route
component: DataConfigurationDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
},
children: [
// Add default redirect here
{ path: '', redirectTo: 'general', pathMatch: 'full' },
{
path: 'general',
component: DataConfigurationGeneralDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'mapping',
component: DataConfigurationMappingDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
},
{
path: 'target',
component: DataConfigurationTargetDetailComponent,
data: {
authorities: ['ROLE_USER'],
pageTitle: 'dataconfiguration.home.title'
}
}
]
}
更新: 更新了路由示例以解决对答案的评论。
要回答您的第一个问题,要使常规选项卡始终成为默认选项卡,您可以将“catch all( * )”路由设置为指向常规选项卡组件.
请参阅此处了解 routerLinkActive
指令的用法:https://angular.io/docs/ts/latest/api/router/index/RouterLinkActive-directive.html
要解决您的第二个问题,请确保您在 app.module.ts
:
import { Routes, RouterModule } from '@angular/router';
并且您正在使用 forRoot,例如
export const routing = RouterModule.forRoot(routesArrayGoesHere)
--更新内容
一个简单的路由配置示例如下所示。
path: ''
是 url 当没有定义参数时,这是您希望用来首先加载常规选项卡的路径,因此您可以将其指向 'general tab'零件。
从技术上讲,path: '**'
路线是找不到路线时的全部,在这种情况下,我会转到错误页面。
const APP_ROUTES: Routes = [
{ path: 'dashboard', component: DashboardComponent },
{ path: '', component: DashboardComponent },
{ path: '**', component: PageNotFoundComponent }
]
您通过在其中嵌套子项使路由变得更加复杂。我建议先让您的路由使用平坦路径,然后再进行试验。 IE。 需要注意的一件事,我使用了 Routes,而不是 Route[](可能是同一件事,但如果仍然有,可以尝试改变问题)。
export const tenantRoute: Route[] = [
{ path: 'tenant', component: TenantComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'tenant.home.title' },
},
{ path: 'tenant:id', component: TenantDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'tenant.home.title' },
},
{ path: 'tenant:id/dataconfiguration/:id', component: DataConfigurationDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
},
{ path: 'tenant:id/dataconfiguration/:id/general', component: DataConfigurationGeneralDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
},
{ path: 'tenant:id/dataconfiguration/:id/mapping', component: DataConfigurationMappingDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
},
{ path: 'tenant:id/dataconfiguration/:id/target', component: DataConfigurationTargetDetailComponent,
data: { authorities: ['ROLE_USER'], pageTitle: 'dataconfiguration.home.title' }
}
];