You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Angular子组件无法获取指定ID详情问题排查求助

解决Angular子组件无法正确获取指定ID详情的问题

我来帮你排查并解决这个问题,从你的代码来看,主要有几个关键问题导致功能异常:


1. 路由参数获取方式错误(最核心问题)

你现在通过this.Route.url.substring()来截取ID,这种方式非常脆弱——一旦路由结构变化就会失效,而且容易得到错误的字符串。Angular提供了专门的ActivatedRoute来安全获取路由参数。

修复方法:

在子组件policy-details.ts中,注入ActivatedRoute,然后通过paramMap订阅路由参数:

import { ActivatedRoute } from '@angular/router';
// ... 其他必要导入

constructor(
  private route: ActivatedRoute,
  private projectclosterservice: ProjectClosterService
) {}

ngOnInit(): void {
  // 订阅路由参数变化,确保每次路由更新都能获取最新ID
  this.route.paramMap.subscribe(params => {
    const productId = params.get('id'); 
    this.GetProductDatabyID(productId);
  });
}

GetProductDatabyID(id: string) {
  this.projectclosterservice.getNetworkList()
    .subscribe(data => {
      this.ProductData = data['1tool-gitlab-pipeline'];
      // 注意:如果你的id是数字类型,需要把字符串转成数字再比较(用+id)
      const matchedProducts = this.ProductData.filter((r: any) => r.id == +id);
      if(matchedProducts.length > 0){
        this.DisplayProductList = matchedProducts;
        console.log(this.DisplayProductList);
      } else {
        // 可以添加无数据提示逻辑
        this.DisplayProductList = [];
        console.log('未找到对应ID的产品');
      }
    }, error => { 
      console.error('获取数据失败:', error);
    });
}

2. 父组件中router-outlet的位置错误

你把<router-outlet>放在了*ngFor循环里面,这会导致每次循环都生成一个路由出口。当你导航到子路由时,所有循环项都会渲染子组件,这就是为什么你看到所有ID详情的原因。

修复方法:

<router-outlet>移到*ngFor循环外面,确保只有一个路由出口:

<!-- ne-policy.html -->
<div class="pb-3 pl-3" *ngFor="let product of selectedItemsList">
  <h4 class="fw-500 fw-b">
    <a (click)="openCaseDetails(product.id)">{{ product.template_name }}</a>
  </h4>
  <p>{{ product.template_name }}</p>
</div>
<!-- 将路由出口移到循环外部 -->
<router-outlet></router-outlet>

3. 额外优化建议

  • 类型安全:尽量避免使用any类型,给产品数据定义接口,减少类型不匹配的隐患;
  • 内存泄漏防护:如果组件会被销毁,记得用takeUntil操作符取消paramMap的订阅;
  • 错误提示:在error回调里添加用户可见的错误提示,提升体验。

完成以上修改后,你的子组件应该就能正确获取指定ID的详情,并且只显示对应的数据了。

内容的提问来源于stack exchange,提问作者Mercy

火山引擎 最新活动