【问题标题】:Can't set up routing to a named outlet in Angular无法在 Angular 中设置到命名插座的路由
【发布时间】:2017-08-18 14:12:43
【问题描述】:

我有三个命名的路由器插座,如下所示。

...
<router-outlet name="menus"><router-outlet>
<router-outlet><router-outlet>
<router-outlet name="footer"><router-outlet>
...

在标记中,我想将第一个 menus 路由到其中包含某些子菜单垃圾的组件,如 shown in the docs

<ul *ngFor="let main of menus;" 
    routerLink="[{outlets:{menus:[{{main.link}}]}}]" 
    class="nav-items">{{main.header}}

我得到的错误是这样的:

错误:无法匹配任何路由。 URL 段:'%5B%7Boutlets:%7Bmenus:%5Bsubmenu1%5D%7D%7D%5D'

我不知道语法有什么问题。用谷歌搜索我的指甲,但没有找到一个 简单粗暴routerLink 版本示例,该示例显示了如何在命名出口中指向路线。

编辑:根据 cmets 和示例,我需要重新编写正在使用的代码,但仍然出现相同的错误。在标记中:

<ul *ngFor="let main of menus;" 
    (click)="pullMenu(main.link)" 
    class="nav-items">{{main.header}}

然后,在 TS 中:

constructor(private router: Router, private route: ActivatedRoute) { }

pullSubmenu(input) {
  console.log(input);
  this.router.navigate(
    [{ outlets: { menus: [input] } }], 
    { relativeTo: this.route });
}

现在,我收到以下错误(submenu1 是配置路径的名称)。

错误:无法匹配任何路由。 URL 段:'submenu1'

我的路由在模块中是这样设置的。

const routes: Routes = [
  { path: "submenu1", component: Submenu1Component },
  { path: "submenu2", component: Submenu2Component }
];

@NgModule({
  declarations: [
    AppComponent,
    NavbarComponent,
    MainAreaComponent,
    Submenu1Component,
    Submenu2Component
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(routes)
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

【问题讨论】:

  • 您在路由器配置中的何处声明outlet 属性?
  • @yurzui 无处可去,兄弟!这就是问题所在(除了无数其他事情)。就在你写评论的时候,我说到做到。发表回复,我一定会为你 +1!
  • 看上面的例子。您可以使用routerLink 进行导航。如果你愿意,你可以投票给我的其他答案:) stackoverflow.com/questions/38038001/…
  • @KonradViltersten,我想通了。正如我的其他回答所说,如果您作为字符串提供命令,您不能使用routerLink,但您可以评估它们并作为数组提供。我将该信息添加到我的答案中。

标签: html angular angular-routing


【解决方案1】:

您需要使用评估版[routerLink]

<ul *ngFor="let main of menus;" 
    [routerLink]="[{outlets:{menus:[{{main.link}}]}}]" 
    class="nav-items">{{main.header}}

作为替代方案,您可以模拟routerLink。以下是其作用的要点:

  @HostListener('click')
  onClick(): boolean {
    const extras = {
      skipLocationChange: attrBoolValue(this.skipLocationChange),
      replaceUrl: attrBoolValue(this.replaceUrl),
    };
    this.router.navigateByUrl(this.urlTree, extras);
    return true;
  }

所以,这里是使用navigate 而不是navigateByUrl 的设置:

   @Component({
      template: `
        <ul *ngFor="let main of menus;" (click)="[{outlets:{menus:[{{main.link}}]}}])"
        class="nav-items">{{main.header}}
      `
   ...
   class MyComponent {
      constructor(router: Router, route: ActivatedRoute) {}

      navigate(commands) {
         this.router.navigate(commands, {relativeTo: this.route})

您不能使用未经评估的routerLink 版本,因为它将命令作为字符串读取,如果您在命令中包含outlets,则字符串不起作用。请参阅Navigation to secondary route URL for routerLink attribute 了解原因。

【讨论】:

  • 是否应该更新您答案的前几行以防止未来读者混淆?
  • @DeborahK,现在是正确的。当您不使用括号时,属性值被评估为字符串,这正是 OP 发生的情况
  • 我读到的第一句话是“你不能使用 routerLink”。但你实际上是在说“嘿,你忘了在它周围加上方括号。”我只是认为措辞可能会被误解。
  • @DeborahK,好的,谢谢,我已经改写了解释,并将未评估的routerLink 移到了底部
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
相关资源
最近更新 更多