【问题标题】:Angular child routes reload parent componentAngular子路由重新加载父组件
【发布时间】:2019-01-21 15:09:13
【问题描述】:

我将提供很多背景知识(也许没有必要),因为我真的不知道如何问这个问题。

我有一个带有路由的 Angular 资产跟踪应用程序,它有一些父路由和几个子路由。子路由都指定父组件并激活该组件内的不同组件(参见代码)。

父组件会生成一个树,其中包含多个路由链接,这些链接指向按位置和类型分组的各种资产的详细信息页面,用户在此树中导航以选择资产。但是,当路由器链接被激活时,它会重新加载父组件,然后是树,现在用户留在起点,必须重新打开树。

我正在尝试确定我是否错误地构建了组件关系,或者我是否从错误的角度进入了这个工作流程。

本质上,我想要实现的是,当用户导航到父组件中的不同位置时,树结构保持不变。无论是详情页、仪表板等。

如何防止每次激活和停用子路由器链接时重新加载父组件?

app-routing.module.ts 代码:

{
    path: 'assets',
    canActivate: [ AuthGuard],
    children: [
         {
            path: '',
            component: AssetsComponent,
         },
         {
            path: 'details/:asset',
            component: AssetsComponent
         },
    ]
},

asset.component.ts 代码:

<div>
    <div class="select-pane">
        ... 
        <div class="asset-list-item lvl-3" routerLink="/assets/details/{{ assetList?.hostname }}" routerLinkActive="selected">{{ assetList?.hostname }}</div>
        ... 
    </div>
</div>
<div class="dialog-pane">
    <app-asset-dashboard *ngIf="!currentAsset"></app-asset-dashboard>
    <app-asset-detail *ngIf="currentAsset" [asset]="currentAsset"> 

【问题讨论】:

  • 我从问题的理解是,AssetComponent 正在处理树的显示和细节。在这种情况下,导航到/details 后,组件正在重新加载。我的建议是,将详细信息放在一个单独的组件中,比如 AssetDetailsComponent 并让它呈现在 AssetComponent 内的 &lt;router-outlet&gt;
  • 是的,AssetComponent 显示一棵树,然后我还有另外两个组件,AssetDetailsComponent 和 AssetDashboardComponent。导航到 /details/'some-asset' 会重新加载不需要的整个 AssetComponent。那么我会把&lt;router-outlet&gt; 放在 AssetComponent 中吗?

标签: angular angular-routing


【解决方案1】:

因为AssetComponent 正在处理''/details 路由,当您导航到/details 时,组件将在树重置的情况下再次加载。我建议,您以这种方式构建应用程序:

另外,我认为您在 '' 路由中需要 pathMatch:full,但我完全确定这是否可以解决任何问题。

{
    path: 'assets',
    component: AssetsComponent,
    canActivate: [ 
    AuthGuard
    ],
    children: [
    {
        path: '',
        redirectTo: 'dashboard',
        pathMatch: 'full',
    },
    {
        path: 'dashboard',
        component: AssetDashboardComponent,
    },
    {
        path: 'details/:asset',
        component: AssetDetailComponent,
    },
    ]
},

AssetComponent 模板应该类似于:

<div>existing component template that has tree</div>
<router-outlet></router-outlet>

AssetDetailsComponent 模板应如下所示:

<div>Asset details are moved here </div>

每个组件的相应组件类将在其中移动数据和函数。

【讨论】:

  • 我试过这个,这就是我认为我从一开始就错误地构建了这个应用程序的地方。或者也许我的问题不清楚。 AssetsComponent 包含不同的 HTML 窗格。 “侧窗格”显示树,我希望“对话框窗格”使用详细信息组件或仪表板组件进行更新。无论所选路线如何,我都希望始终显示侧窗格。
  • 您可能希望该树/导航作为另一个组件,并使用 AssetComponent 模板中的选择器包含在内。让我编辑答案并为您包括该部分。
  • 我能够让它工作,我更新了答案以显示我使用的路由。我将父组件添加到父路由中,并向仪表板添加了重定向,这反过来又加载了仪表板组件。如图所示,我向 AssetsComponent 添加了一个路由器插座,这一切都按预期工作了!感谢您的指导@Aragorn
猜你喜欢
  • 2017-11-20
  • 2021-05-31
  • 2019-05-06
  • 2018-10-31
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多