EnriqueMark
Angular

父子组件传参

2026-04 简体中文

angular确实是把订阅者-接收者贯彻始终,包括子传父在内也是利用了Observable的机制,子层发布一个事件,而父层则订阅这个事件,等待其触发后来执行相应的回调。

比如下面这个操作,子层确立了一个Output,对外发布了一个事件。this.commit.emit(val)就是触发事件的操作,向订阅者返回需要执行回调的信号,而val就是$event回传的内容,在new的时候用<T>定义。

@Component({ selector: 'app-child', ... })
export class ChildComponent {
  @Input() value = '';        // 接收父層狀態
  @Output() commit = new EventEmitter<string>();  // 定義回調出口

  onInput(event: Event) {
    const val = (event.target as HTMLInputElement).value;
    this.commit.emit(val);    // 觸發回調,把新值傳給父層
  }
}

下面的父层用[v] 来定义子层的 Input ,()则是订阅子层发布的事件,其内容当然就是该事件触发时的回调。

<app-child
  [value]="form.get('username')?.value"
  (commit)="form.get('username')?.setValue($event)">
</app-child>

这个地方的Output其实只要求是Observable就好,没有一定要求用EventEmitter,但那不是推荐写法。既然官方已经推荐最好就用事件,那为了防止意料之外的事情出现,走标准做法是最好的。可以说,发现这个地方用了莫名其妙的自定义Observable是一种坏味道——除非真有什么极端场景,要求其必须自定义一个,否则正常情况下就不该用。