【问题标题】:Angular 2 - children component in parents router outletAngular 2 - 父路由器插座中的子组件
【发布时间】:2017-07-02 15:06:36
【问题描述】:

我目前正在尝试实现具有多个导航级别的 Angular 2 应用程序。 问题是我的子组件没有在我的路由的父组件中明确声明时找不到路由器出口。

这是我收到的错误消息:

Unhandled Promise rejection: Cannot find primary outlet to load 'EditUserComponent'

当我单击按钮或链接时,我想要一个编辑视图或详细视图,而不是列表视图。 视图嵌入在具有导航结构并为内容提供路由出口的模板布局中。我也想用我所有的观点来定位这个路由器插座。我已经尝试使用命名网点但没有成功。 我使用面包屑组件来显示当前路线,因此我无法将编辑/详细视图作为我的列表组件的兄弟。

为了更清楚,我做了一个 plunker 演示:

https://embed.plnkr.co/XXxADnS7q8FCfF4W84tS/

如何解决插座问题并从子组件中定位布局的路由器插座?

【问题讨论】:

  • 很高兴您添加了一个 plunkr,这在尝试提供帮助时很有帮助:)

标签: angular angular2-routing


【解决方案1】:

一种解决方案可能是简单地将所有内容包装在您的UsersComponent 模板中,除了router outlet 中的div。然后隐藏/显示div,如果组件有孩子(UsersEditComponent在这种情况下)或没有。

这样做的目的是让您的路由器在UsersComponentUsersEditComponent 之间保持正确的父/子层次结构,同时在激活该路由时仍然只显示UsersEditComponent 内容。

这是 UsersComponent 的一个实现,正是这样做的:

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';

@Component({
  template: 
  `<div *ngIf="!hasChildren">
    User 1 <button md-icon-button (click)="editUser(1)">edit</button><br/>
    User 2 <button md-icon-button (click)="editUser(2)">edit</button>
  </div>
  <router-outlet></router-outlet>
  `
})

export class UsersComponent implements OnInit {
  private hasChildren: bool;
  constructor(private router: Router, private route:ActivatedRoute) { }

  editUser(id) {
    this.router.navigate(['users/edit', id]);
  }

  ngOnInit() {
    this.hasChildren = false;
    this.router.events.filter(event => event instanceof NavigationEnd).subscribe(event => {
      this.hasChildren = this.route.children.length > 0;
    }
  }
}

【讨论】:

  • 这正是我面临的问题。当我在那里添加路由器插座时,它会起作用,但它也会在我的编辑表单上方显示列表。我希望我的编辑表单替换列表。
  • @kaischo - 对不起,误解了你。更新了我的答案!
  • @kaischo,啊,抱歉阅读草率:/。您的breadcrumb component 是如何工作的?它只是解析网址吗?如果是这样,您可以将路由保留为兄弟,只需将路径从“edit:id”更改为“users/edit:id”。
  • @kaischo,无论如何我都会更新答案,以更好地符合您的要求。如果由于您的breadcrumb component 而这不起作用,请告诉我
  • @kaischo,感谢 plunkr 的更新。事实证明,面包屑并没有解析 url,而是实际上查看了父/子层次结构 - 这意味着我提供的解决方案将不起作用。如果到那时还没有解决,我稍后会研究这个问题
猜你喜欢
  • 2018-07-28
  • 2017-03-04
  • 2018-02-27
  • 2017-09-09
  • 2017-02-27
  • 2018-09-23
  • 2016-12-30
  • 2017-03-09
  • 1970-01-01
相关资源
最近更新 更多