使用当前的代码,我试图在我的 Accordion 组件中进行深层链接。
通过导航到dev.local/#/accordion
,然后单击一个 Accordion 标题,我希望将路线更新为:dev.local/#/accordion/2
但是,一旦设置了该路径,我就不想导航到该路径。本质上,如果有人假想复制此URL,它将把他们返回到他们复制它时打开的确切 Accordion 。
我遇到的问题是,我将以下代码应用于 Accordion 链接以设置参数:
<a [routerLink]="['Accordion',{tab:'4'}]"></a>
这可以工作,但实际上可以导航并重新初始化组件。我需要能够单击此链接,将路线设置为
dev.local/#/accordion/4
,而无需通过导航到它来重新初始化组件。这是我目前的路线:
@RouteConfig([
{
path: '/accordion',
component: Accordion,
as: 'AccordionNew'
},
{
path: '/accordion/:tab',
component: Accordion,
as: 'Accordion'
}
]);
最佳答案
如果辅助路线无济于事,您可以尝试使用我的解决方案,以解决更常见的问题:
AccordionComponent并将其用作RootAccordionComponent中的标记
模板(例如)。还要在此模板中放置一个位置。对于RootAccordionComponent,请使用“path:'/accordion/...'”RouteConfig。
这样,如果有人使用tabId直接转到URL时,当AccordianComponent初始化时,您可以获得tabId,但是如果用户单击Accordian,它将不会重新加载。
有关工作示例,请参见此柱塞:
http://plnkr.co/edit/5HEgIUZGRP3Cfqh6LvzA?p=preview
如果在单独的窗口中启动预览,则还可以查看路线。例如。如果您加载“http://run.plnkr.co/WOpQaPkFafJ7uU8Y/#/accordion/2”,则所选的 Accordion 将设置为2。
希望这会有所帮助,尽管它不是最干净的解决方案。
RouteConfig进入AccordionRoot:
@RouteConfig([
{path:'/accordion/...', name: 'AccordionRoot', component: AccordionRootComponent},
])
export class AppComponent { }
实际的AccordionRootComponent:
@Component({
template: `
<router-outlet></router-outlet>
<accordion-component></accordion-component>`,
directives: [ROUTER_DIRECTIVES, AccordionComponent]
})
@RouteConfig([
{ path: '/:tabId', name: 'AccordionTab', component: TabIdAccordionComponent, useAsDefault: true}
])
export class AccordionRootComponent { }
TabIdAccordionComponent:
@Component({
template: ''
})
export class TabIdAccordionComponent {
constructor(private routeParams: RouteParams, private accordionService: AccordionService){
let tabId = +this.routeParams.get("tabId");
this.accordionService.tabId = tabId;
}
}
使用服务中的tabId的AccordionComponent:
导出类AccordionComponent实现OnInit {
构造函数(私有(private)AccordionService:AccordionService){}
selectedAccordionId:数字;
ngOnInit(){
this.setSelectedAccordion(this.accordionService.tabId);
}
setSelectedAccordion(tabId: number){this.selectedAccordionId = tabId;}
}