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

Angular EventEmitter未触发父组件方法问题排查

Angular EventEmitter触发后父组件方法未执行

父组件包含<search-box>和<table-component>两个子组件,期望接收<search-box>通过EventEmitter传递的值,调用setBoolean方法更新布尔值,以此控制<table-component>的显示。目前子组件的emit()函数可正常执行,但父组件的setBoolean()方法完全没运行。

父组件原代码

@Component({
  selector: 'parent',
  template: `
<search-box  (emitter)="(setBoolean($event))"></search-box>
<table-component *ngIf="tableBoolean"></table-component>
`,
})
@Injectable({
  providedIn: 'root',
})
export class SearchComponent implements OnInit {
  tableBoolean = false;
  constructor() {
  }

  setBoolean(valueEmitted: any){
    this.tableBoolean = true;
    console.log(this.tableBoolean)
    console.log(valueEmitted)
  }
  ngOnInit(): void {
  }
}

search-box子组件原代码

@Component({
  selector: 'search-box',
  templateUrl: './search-box.component.html',
  styleUrls: ['./search-box.component.css']
})
export class SearchBoxComponent implements OnInit {
  @Output() emitter = new EventEmitter<string>();
  constructor(private _renderer2: Renderer2,
    @Inject(DOCUMENT) private _document: Document) {
  }
  emit(){
    this.emitter.emit("TEST");
  }

  ngOnInit(): void {
    let script = this._renderer2.createElement('script');
    script.src = urls.prod;
    this._renderer2.appendChild(this._document.body, script);
  }
}

问题原因及解决方案

1. 事件绑定语法错误

父组件模板里的事件绑定多了一层冗余括号:

(emitter)="(setBoolean($event))"

这会导致Angular无法正确解析并调用setBoolean方法,正确的写法应该去掉外层括号:

(emitter)="setBoolean($event)"

2. 错误添加@Injectable装饰器

组件类不需要@Injectable装饰器,这个装饰器是给服务类用的。给组件添加@Injectable会导致组件的实例化逻辑异常,进而影响方法的正常调用,必须移除这部分代码。

修正后的父组件代码

@Component({
  selector: 'parent',
  template: `
<search-box  (emitter)="setBoolean($event)"></search-box>
<table-component *ngIf="tableBoolean"></table-component>
`,
})
export class SearchComponent implements OnInit {
  tableBoolean = false;
  constructor() {
  }

  setBoolean(valueEmitted: any){
    this.tableBoolean = true;
    console.log(this.tableBoolean)
    console.log(valueEmitted)
  }
  ngOnInit(): void {
  }
}

做以上两处修改后,父组件的setBoolean方法就能正常被触发,tableBoolean值会更新,<table-component>也会随之显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:01:56