首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们返回到Web组件时,将角web组件路由路由到最后一个组件

当我们返回到Web组件时,将角web组件路由路由到最后一个组件
EN

Stack Overflow用户
提问于 2022-04-28 12:12:24
回答 1查看 133关注 0票数 0

我们已经构建了一个具有角元素的web组件,并在父角应用程序中使用。

但问题似乎在于web组件的路由。

上一次加载的组件似乎与当前的url无关。

现在转到另一条路由,然后返回到web组件。

代码语言:javascript
复制
|
|
V

最后一个图像显示,当url没有指向路由一时,路由一仍然在加载。

有没有人对如何处理这个场景有任何想法。

链接到项目

------------------------------------EDIT------------------------------------

Web组件代码:

基本构成部分:

代码语言:javascript
复制
@Component({
  selector: 'app-route-comp',
  template: `<div>
      <ul>
        <li><a [routerLink]="['/base']">Base</a></li>
        <li><a [routerLink]="['/base', 'r1']">R1</a></li>
        <li><a [routerLink]="['/base', 'r2']">R2</a></li>
        <li><a [routerLink]="['/base', 'r3']">R3</a></li>
      </ul>
    </div>
    <router-outlet (activate)="onActivate($event)"></router-outlet>`,
})
export class RouteCompComponent implements OnInit, OnDestroy {
  constructor(private router: Router) {}

  ngOnInit(): void {}

  onActivate(event: Component) {
    console.log(event);
  }

  ngOnDestroy() {}
}

第一条路线:

代码语言:javascript
复制
@Component({
  selector: 'app-route-one',
  template: '<p>route-one works!</p>',
})
export class RouteOneComponent {}

app组件:

代码语言:javascript
复制
@Component({
  selector: 'app-root',
  template: '<router-outlet></router-outlet>',
})
export class AppComponent implements OnInit, OnDestroy {
  constructor(private router: Router) {}
  ngOnInit() {
    console.log('hello');
    this.router.initialNavigation();
  }

  ngOnDestroy() {}
}

路线:

代码语言:javascript
复制
const routes: Routes = [
  {
    path: 'base',
    component: RouteCompComponent,
    children: [
      {
        path: 'r1',
        component: RouteOneComponent,
      },
      {
        path: 'r2',
        component: RouteTwoComponent,
      },
      {
        path: 'r3',
        component: RouteThreeComponent,
      },
    ],
  },
];

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

应用程序模块:

代码语言:javascript
复制
@NgModule({
  declarations: [
    AppComponent,
    RouteCompComponent,
    RouteOneComponent,
    RouteTwoComponent,
    RouteThreeComponent,
  ],
  imports: [BrowserModule, AppRoutingModule],
  providers: [],
})
export class AppModule {
  constructor(private injector: Injector) {}
  ngDoBootstrap() {
    const { injector } = this;

    const routeCompWC = createCustomElement(AppComponent, { injector });
    customElements.define('wc-1', routeCompWC);
  }
}

消费应用:

app组件:

代码语言:javascript
复制
@Component({
  selector: 'app-root',
  template: `<a routerLink="/base">base route</a>
    &nbsp;&nbsp;
    <a routerLink="/alt">alt route</a>

    <router-outlet></router-outlet>`,
})
export class AppComponent {}

路线:

代码语言:javascript
复制
const routes: Routes = [
  {
    path: 'base',
    component: OuterRouteComponent,
    children: [{ path: '**', component: OuterRouteComponent }],
  },
  {
    path: 'alt',
    component: OuterRouteTwoComponent,
  },
];

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

外部构成部分:

代码语言:javascript
复制
@Component({
  selector: 'app-outer-route',
  template: '<div #wc></div>',
})
export class OuterRouteComponent implements AfterViewInit {
  @ViewChild('wc') wc!: ElementRef<HTMLDivElement>;

  ngAfterViewInit() {
    const wc1El = document.createElement('wc-1') as NgElement &
      WithProperties<any>;

    this.wc.nativeElement.appendChild(wc1El);
  }
}

外部两个组成部分:

代码语言:javascript
复制
@Component({
  selector: 'app-outter-route-two',
  template: '<p>outer-route-two works!</p>',
})
export class OuterRouteTwoComponent {}

我相信这能行。

EN

回答 1

Stack Overflow用户

发布于 2022-04-29 13:45:40

在努力解决这个问题之后,想出一个解决办法。

代码语言:javascript
复制
@Component({
  selector: 'app-root',
  template: '<router-outlet></router-outlet>',
})
export class AppComponent implements OnInit, OnDestroy {
  constructor(
    private router: Router,
    @Inject(DOCUMENT) private document: Document
  ) {}
  ngOnInit() {
    const fullHash = this.document.defaultView?.location.hash.substring(1);
    if (this.router.url !== '/' && this.router.url !== fullHash) {
      const hashSplit = fullHash?.split('?');
      const queryParams =
        hashSplit?.length && hashSplit?.length > 1
          ? hashSplit[1]
              .split('&')
              .map((ele) => ele.split('='))
              .reduce(
                (reduced: object, ele) => ({
                  ...reduced,
                  [ele[0]]: ele[1] ?? '',
                }),
                {}
              )
          : {};
      hashSplit?.length &&
        this.router.navigate([hashSplit[0]], {
          queryParams,
        });
    }
    this.router.initialNavigation();
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72043469

复制
相关文章

相似问题

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