angular - Routerlink 导航后,Router-outlet 未更新
问题描述
我正在创建一个带有导航菜单的简单 Angular 应用程序。每个菜单项都有一个Routerlink
在页面之间导航。这是页面:
- 主页 (
#/home
) - 客户/信息 (
#/customer/info
) - 客户/详情 (
#/customer/details
) - 客户 / 详情 / b0 (
#/customer/details/b0
) - 客户 / 详情 / b1 (
#/customer/details/b1
)
相关代码:
app.module.ts
@NgModule({
imports: [
BrowserModule,
FormsModule,
RouterModule.forRoot(
[
{
path: "",
redirectTo: "home",
pathMatch: "full"
},
{
path: "home",
component: HomeComponent
},
{
path: "customer",
component: CustomerComponent,
children: [
{
path: "",
redirectTo: "info",
pathMatch: "full"
},
{
path: "info",
component: CustomerInfoComponent,
},
{
path: "details",
component: CustomerDetailsComponent,
children: [
{
path: "",
redirectTo: "b0",
pathMatch: "full"
},
{
path: "b0",
component: CustomerDetailsBlock0Component
},
{
path: "b1",
component: CustomerDetailsBlock1Component
},
]
}
]
}
],
{useHash: true}
)
],
declarations: [ AppComponent, CustomerComponent, MenuComponent, HomeComponent, CustomerInfoComponent, CustomerDetailsComponent, CustomerDetailsBlock0Component, CustomerDetailsBlock1Component ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
客户组件.html
<p>This is customer #{{id}}</p>
<app-menu>
<router-outlet></router-outlet>
</app-menu>
客户详情-component.html
<p>This is customer details</p>
<router-outlet></router-outlet>
客户详情-block0-component.html
<p>details block0</p>
客户详情-block1-component.html
<p>details block1</p>
菜单组件.html
<div>
<ul>
<li>
<a routerLink="">Home</a>
</li>
<li>
<a routerLink="../customer">Customer</a>
<ul>
<li>
<a routerLink="../customer/info">Info</a>
</li>
<li>
<a routerLink="../customer/details">Details</a>
<ul>
<li>
<a routerLink="../customer/details/b0">Block #0</a>
</li>
<li>
<a routerLink="../customer/details/b1">Block #1</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>------------- Content inside menu router-outlet -------------</p>
<router-outlet></router-outlet>
<p>--------------------------------------------------------------------</p>
</div>
导航工作正常:当我点击一个链接时,激活的路线发生了变化,router-outlet
更新了并显示了预期的组件。
当我刷新页面时出现问题#/customer/details/b1
(或者如果我直接点击它,而不点击父菜单项):组件是好的,但我的菜单坏了。如果我单击链接以#/customer/details/b0
更改路线但未更新路由器插座,则该b1
组件仍会显示并且b0
不显示。当我单击 URL 不以“客户/详细信息”开头的另一个菜单项时,此问题已得到解决,例如,如果我单击“信息”,则问题就消失了。
我想这是一个关于组件customer-details
是同一个实例的问题,所以 Angular 重用了它。但是为什么子组件没有改变呢?
我设法通过在每次调用路由器shouldReuseRoute函数时返回 false 来“修复”此行为:
// menu-component.ts
constructor(private router: Router) {
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
}
但我不希望每次都销毁/创建我的所有组件。有什么解决办法吗?
这是Stackblitz 演示。要重现错误:
- 点击链接“Block #1”
- 刷新 Stackblitz 输出窗口
- 单击“Block #0”或“Details”:路线已更改,但消息仍为“details block1”
- 点击“信息”
- 重复步骤 1。-> 现在问题已解决。
编辑:我仍然有 Angular v6.1.3 的问题(我更新了Stackblitz 演示)。我尝试了@mast3rd3mon 提供的所有解决方案,但似乎没有任何解决方法。
解决方案
看了自己做的demo后,需要去掉..
router链接的部分。../customer
变成/customer
,../customer/info
变成/customer/info
等
它可能只是演示,但请确保 app.component.html 文件看起来不像<router-outlet></router-outlet>
,<router-outlet>
因为标签需要有一个结束标签。
推荐阅读
- haskell - 安装可执行文件时硬编码 datadir 路径
- c++ - 如何在 SML 状态或状态机中添加/初始化成员?
- r - R:在存在多个括号的情况下替换内部方括号
- python - pip - 使用具有两个不同 index-url 的两个 requierements.txt 文件
- amazon-web-services - 当 --profile 作为参数传递时,AWS SAM CLI 本地调用帐户 ID 未设置
- html - 如何使我的方形图像响应?
- ruby-on-rails - 如果 css_lint 返回错误,Circleci buld 应该会失败
- java - 如何在 Springboot REST API 中为 db insert 方法编写模拟单元测试?
- redhawksdr - 在域中运行时创建动态波形
- python - Python sorted() 函数空间复杂性