You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular子组件@Output传值致父组件重复渲染Header问题求助

嘿,我一眼就瞅到问题所在啦!你之所以会在App组件里重复渲染Header模板,核心原因是你在app.component.html中两次引入了<app-app-header>组件——一次是页面最顶部的独立标签,另一次是在flex容器里带(searchListOutput)事件绑定的那个,这直接导致Header被渲染了两次。

接下来给你一步步修正:

第一步:修复App组件的模板(移除重复的Header引用)

把app.component.html里重复的<app-app-header>删掉,只保留一个,并把事件绑定加到这个唯一的Header标签上:

<!-- 只保留这一个Header组件,并绑定搜索结果的接收事件 -->
<app-app-header (searchListOutput)="searchListOutput($event)"></app-app-header>

<div style="display: flex;">
  <!-- 这里原来的重复Header组件已移除 -->
  <div>
    <div class="container">
      <h5>Today's recommendations</h5>
      <div *ngIf="searchListParentOutput">
        <div class="row">
          <div *ngFor="let issues of searchListParentOutput" class="col-sm-4 py-2">
            <div class="card text-black ">
              <div class="card-body text center">
                <h4 class="card-title">{{issues.issue_name}}</h4>
                <h6 class="card-subtitle mb-2">{{issues.issue_number}}</h6>
                <p class="card-text">{{issues.issue_message}}</p>
                <a href="#" class="btn btn-primary">Read more</a>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

<router-outlet></router-outlet>
<router-outlet name='addIssue'></router-outlet>

<div>
  <!-- translation: translation pipe -->
  <h1>{{ 'demo.title' | translate }}</h1>
  <!-- translation: directive (key as attribute)-->
  <p [translate]="'demo.text'"></p>
  <!-- translation: directive (key as content of element) -->
  <p translate>demo.text</p>
  <button (click)="switchLanguage('en')">en</button>
  <button (click)="switchLanguage('fr')">de</button>
</div>

<app-app-footer></app-app-footer>

第二步:优化Header组件的搜索逻辑(可选)

我注意到你当前的getList()方法是直接获取全部Issues列表,而非根据用户输入的关键词过滤。如果你的需求是返回匹配搜索关键词的结果,可以调整Header组件的逻辑:

// app-header.component.ts
set selectedObj(newObj) {
  this._selectedObj = newObj.issue_name;
  console.log("Calling happens", newObj);
  if (newObj != null && newObj.issue_name && newObj.issue_name.length > 2) {
    // 将搜索关键词传入getList方法
    this.getList(newObj.issue_name);
  }
}

// 修改getList,支持根据关键词获取结果
getList(searchKeyword?: string) {
  // 有关键词则调用带参数的接口,无则获取全部列表
  const request$ = searchKeyword 
    ? this.bugService.GetIssue1(searchKeyword)
    : this.bugService.GetIssues();
  
  request$.subscribe((data: {}) => {
    this.searchListChild(data);
  });
}

现在再测试一下,Header只会渲染一次,搜索结果也会正确展示在App组件的容器里啦。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:45