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

Angular子组件调用父组件传入函数时无法访问父组件公共属性

Angular组件间函数传递导致this上下文丢失的解决方案

问题原因

当你把父组件的setEntrada函数作为Input传给子组件后,调用该函数时,this的上下文不再指向父组件实例,而是变成子组件实例或undefined(严格模式下),因此console.log(this.entrada)会输出undefined。你尝试EventEmitter时出错,大概率是用法不符合Angular组件通信规范。

解决方法

方法1:绑定函数的this上下文

方式A:模板中用bind绑定父组件this

修改父组件模板,传递函数时显式绑定父组件的this:

<app-entrada-hall [setEntrada]="setEntrada.bind(this)" ></app-entrada-hall>

方式B:将父组件函数定义为箭头函数

箭头函数会继承外层上下文的this,直接修改父组件的setEntrada定义:

// 父组件类中修改setEntrada
setEntrada = (field: any, observation: any, fieldText: any):void => {
  console.log(this.entrada);
}

此时模板无需额外处理,直接传递函数即可:

<app-entrada-hall [setEntrada]="setEntrada" ></app-entrada-hall>

方法2:正确使用EventEmitter(推荐)

EventEmitter是Angular组件间通信的标准方式,可彻底避免this上下文问题,具体步骤如下:

子组件代码修改

import { Component, OnInit, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-entrada-hall',
  templateUrl: './entrada-hall.component.html',
  styleUrls: [
    '../../../pages/bookings/new-booking-modal/new-booking-modal.page.scss',
    './entrada-hall.component.scss',
  ],
})
export class EntradaHallComponent implements OnInit {
  // 定义Output事件,携带需要传递的数据结构
  @Output() setEntradaEvent = new EventEmitter<{field: any, observation: any, fieldText: any}>();
  constructor() {}
  public limpiezaEntrada: boolean;
  ngOnInit() {}

  setEntradaMain(field: any, observasion:any, fieldText: any,) {
    // 发射事件并传递数据
    this.setEntradaEvent.emit({field, observation: observasion, fieldText});
  }
}

父组件模板修改

监听子组件的事件,调用父组件自身的setEntrada函数:

<app-entrada-hall (setEntradaEvent)="setEntrada($event.field, $event.observation, $event.fieldText)" ></app-entrada-hall>

父组件函数保持原样

此时父组件函数由自身调用,this上下文正确,可正常访问this.entrada:

setEntrada(field: any, observation: any, fieldText: any):void {
  console.log(this.entrada);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:37:46