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

Angular中存储ag-grid的onRowClicked事件数据时遇undefined问题

解决Angular中ag-grid onRowClicked回调里this指向错误导致成员变量undefined的问题

你遇到的这个问题我之前也碰到过,核心原因是JavaScript里的this上下文绑定问题。当你直接把this.rowClicked赋值给gridOptions.onRowClicked时,ag-grid在触发这个回调函数的时候,会以普通函数的方式调用它,此时函数内部的this指向的是ag-grid的grid实例,而不是你的OilTypesComponent组件实例。所以你在rowClicked里给this.selectedOil赋值,其实是给grid对象加了个属性,组件自己的selectedOil成员变量根本没被赋值,自然在delete方法里访问的时候就是undefined了。

下面给你几种可行的解决方案:

解决方案1:用箭头函数保留组件的this上下文

箭头函数不会创建自己的this,它会继承外层上下文的this(也就是你的组件实例)。修改ngOnInit里的gridOptions赋值即可:

export class OilTypesComponent implements OnInit { 
  ... 
  selectedOil : any; 
  gridOptions: GridOptions = <GridOptions>{}; 

  ngOnInit() { 
    this.gridOptions = { 
      ... 
      onCellEditingStopped: (event) => this.cellEdited(event), // 同样处理cellEdited,避免踩同样的坑
      onRowClicked: (event) => this.rowClicked(event) 
    } 
  } 

  rowClicked(event){ 
    this.selectedOil = event.data; 
  } 

  delete(){ 
    console.log(`Deleting ${this.selectedOil.manufacturer}`); 
  }
}

解决方案2:提前用bind绑定this到组件实例

在ngOnInit里,先把rowClicked和cellEdited方法的this绑定到组件实例,再赋值给gridOptions:

export class OilTypesComponent implements OnInit { 
  ... 
  selectedOil : any; 
  gridOptions: GridOptions = <GridOptions>{}; 

  ngOnInit() { 
    // 手动绑定this到组件实例
    this.rowClicked = this.rowClicked.bind(this);
    this.cellEdited = this.cellEdited.bind(this);

    this.gridOptions = { 
      ... 
      onCellEditingStopped: this.cellEdited, 
      onRowClicked: this.rowClicked 
    } 
  } 

  rowClicked(event){ 
    this.selectedOil = event.data; 
  } 

  delete(){ 
    console.log(`Deleting ${this.selectedOil.manufacturer}`); 
  }
}

解决方案3:直接在gridOptions里写箭头函数逻辑

如果你的rowClicked逻辑比较简单,也可以直接把逻辑写在gridOptions的箭头函数里,省去单独的方法:

export class OilTypesComponent implements OnInit { 
  ... 
  selectedOil : any; 
  gridOptions: GridOptions = <GridOptions>{}; 

  ngOnInit() { 
    this.gridOptions = { 
      ... 
      onCellEditingStopped: (event) => {
        // 在这里直接写cellEdited的逻辑
      },
      onRowClicked: (event) => {
        this.selectedOil = event.data;
      } 
    } 
  } 

  delete(){ 
    console.log(`Deleting ${this.selectedOil.manufacturer}`); 
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:39:18