首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当子路由改变时,角5父节点重新加载

当子路由改变时,角5父节点重新加载
EN

Stack Overflow用户
提问于 2018-05-04 10:51:06
回答 3查看 2.3K关注 0票数 2

每当一个子组件更改(子路由更改)时,我的父组件(LoggedInComponent)都会被重新加载,我遇到了问题。

我到处寻找答案,但似乎找不到适合我的情况。

这是我的app-routing.module.ts

代码语言:javascript
复制
const routes: Routes = [
  { path: 'login', component: LoginComponent },
  {
    path: '', component: LoggedInComponent, canActivateChild: [AuthGuard], children: [
      { path: '', redirectTo: 'home', pathMatch: 'full' },
      { path: 'home', component: DashboardComponent },

      { path: 'groups', component: GroupsComponent, data: { role: [PermissionEnum.Groups_View] } },
      { path: 'groups/edit/:id', component: GroupDetailComponent, data: { role: [PermissionEnum.Groups_Edit] } },
      { path: 'groups/create', component: GroupDetailComponent, data: { role: [PermissionEnum.Groups_Create] } },

      { path: 'users', component: UsersComponent, data: { role: [PermissionEnum.Users_View] } },
      { path: 'users/edit/:id', component: UserDetailComponent, data: { role: [PermissionEnum.Users_Edit] } },
      { path: 'users/create', component: UserDetailComponent, data: { role: [PermissionEnum.Users_Create] } },

      { path: 'profile', component: ProfileComponent },
      { path: 'profile/:tabindex', component: ProfileComponent },

      { path: 'settings', component: SettingComponent, data: { role: [PermissionEnum.Global_Settings_View] } },

      { path: 'external-login/:result', component: ExternalLoginProvidersComponent },

      { path: 'permissions/:id/:type', component: PermissionsComponent, data: { role: [PermissionEnum.Users_AssignPermissions] } },
      { path: 'permission-denied', component: PermissionDeniedComponent },

      { path: 'reference-data/:type', component: ReferenceDataComponent, data: { role: [PermissionEnum.Sms_Template_View] } },
      { path: 'reference-data/:type/edit/:id', component: ReferenceDataDetailsComponent, data: { role: [PermissionEnum.Sms_Template_Edit] } },
      { path: 'reference-data/:type/create', component: ReferenceDataDetailsComponent, data: { role: [PermissionEnum.Sms_Template_Create] } },

      { path: 'tenants', component: TenantsComponent, data: { role: [PermissionEnum.Tenant_View] } },
      { path: 'tenants/edit/:id', component: TenantDetailComponent, data: { role: [PermissionEnum.Tenant_Edit] } },
      { path: 'tenants/create', component: TenantDetailComponent, data: { role: [PermissionEnum.Tenant_Create] } },

      { path: 'sms-campaigns', component: SmsCampaignsComponent, data: { role: [PermissionEnum.SmsCampaign_View] } },
      { path: 'sms-campaigns/create', component: CreateSmsCampaignComponent, data: { role: [PermissionEnum.SmsCampaign_Create] } },
      { path: 'sms-campaigns/details/:id', component: SmsCampaignDetailsComponent, data: { role: [PermissionEnum.SmsCampaign_View] } },

      { path: 'document-library', component: LibraryDocumentsComponent },

      { path: 'report-management', component: ReportManagementComponent },
      { path: 'report-management/create', component: CreateReportComponent },
      { path: 'report-management/:id', component: IdpComponent },
      { path: 'report-management/edit/:id', component: ReportDetailsComponent },
      { path: 'report/:reportName', component: ReportComponent }
    ]
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

我有我的app.component.html的主路由器插座,它在登录后带您到LoggedInComponenet,它有页眉、页脚、左菜单和另一个儿童路由器出口。

这是我的LoggedIn.componenent.html

代码语言:javascript
复制
<app-header></app-header>
<div class="m-grid__item m-grid__item--fluid m-grid m-grid--ver-desktop m-grid--desktop m-body">
  <app-left-menu></app-left-menu>
  <div *ngIf="loading">
    <app-loading-indicator></app-loading-indicator>
  </div>
  <div class="center-display" *ngIf="childrenLoadingAllowed">
    <router-outlet class="m-grid__item m-grid__item--fluid m-wrapper" [ngClass]="{ hidden: loading }"></router-outlet>
  </div>
</div>
<app-footer></app-footer>

然后我有了我的LoggedIn.component.ts

代码语言:javascript
复制
import { Component, OnInit } from '@angular/core';
import { BaseComponent } from '../shared/base.component';

@Component({
  selector: 'app-logged-in',
  templateUrl: './logged-in.component.html',
  styleUrls: ['./logged-in.component.css']
})
export class LoggedInComponent extends BaseComponent implements OnInit {

  public loading = true;
  public childrenLoadingAllowed = false;

  constructor() {
    super();
  }

  ngOnInit() {
    this.layoutService.setLoadingEvent
      .subscribe((res: boolean) => {
        if (this.loading !== res)
          this.loading = res;
      });
  }
}

最后,这里是左菜单,当我加载一个子程序时,它会继续重新加载。

代码语言:javascript
复制
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { BaseComponent } from '../../shared/base.component';
import { PermissionEnum, LookupClient, LookupType, LookUpDto } from '../../../services/web-api-generated';

@Component({
  selector: 'app-left-menu',
  templateUrl: './left-menu.component.html',
  styleUrls: ['./left-menu.component.scss'],
  encapsulation: ViewEncapsulation.None
})

export class LeftMenuComponent extends BaseComponent implements OnInit {

  public hasReports = false;

  public reports: Array<LookUpDto> = new Array<LookUpDto>();

  constructor(private lookupClient: LookupClient) {
    super();

    this.loadReportMenuItems();
  }

  ngOnInit() {
    this.layoutService.rebuildReportMenu
      .subscribe(res => {
        this.loadReportMenuItems();
      });
  }

  private loadReportMenuItems(): void {
    this.lookupClient.getLookUpValues(LookupType.MunicipalReports)
      .subscribe((res: Array<LookUpDto>) => {
        this.reports = res;

        this.reports.forEach(element => {
          element.value = element.value.replace(/\s+/g, '-').toLocaleLowerCase();
        });

        this.hasReports = res.length > 0;
      });
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-14 06:30:34

我通过将api调用移动到带有变量的服务解决了这个问题,并且只有在还没有设置数据或传递了force变量的情况下才加载数据。

票数 1
EN

Stack Overflow用户

发布于 2018-06-20 08:13:38

我相信这是一个bug,正如这里提到的:https://github.com/angular/angular/issues/18374

票数 1
EN

Stack Overflow用户

发布于 2019-02-25 15:16:19

是的,canActivateChild在子路由之间更改时重新加载整个父组件。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50173197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档