7

I'm trying to call a function in my context menu.

getContextMenuItems(params) {
    console.log(params.node.data)
    var result = [

      {
        name: "Delete",
        action : function () { 
         this.deletePriceFactor(params.node.data);
        }
        ,
        cssClasses: ["redFont", "bold"]
      },
      {
        name: "Audit"
      }

    ]
      return result;
    }

 deletePriceFactor = (rowdata)  =>{
    this.priceFactorService.deleteEntry(rowdata.exchangeCode, rowdata.productCode, rowdata.secType).subscribe(pricefactors => {
    });

  }

I keep getting an error: ERROR TypeError: this.deletePriceFactor is not a function at Object.action (price-factor.component.ts:162)

I have tried using arrow functions like this:

action : () =>  { 
         this.deletePriceFactor(params.node.data);
        }

The above results in another error: core.js:1673 ERROR TypeError: Cannot read property 'deletePriceFactor' of undefined

MarkJ
  • 411
  • 1
  • 9
  • 23

2 Answers2

10

if your html is like:

<ag-grid-angular
      [getContextMenuItems]="getContextMenuItems"
      .
      .
      .
    ></ag-grid-angular>

then the function getContextMenuItems must be writen like :

getContextMenuItems = (params) => {
}

Hence, the this keyword points to your component.

After that, call your method like:

action : () => this.deletePriceFactor(params.node.data)
bubbles
  • 2,597
  • 1
  • 15
  • 40
2

You can add the reference to this in grid's context -

this.gridOptions.context = {
                    thisComponent : this
                };

And then, thisComponent can be access as below -

private getContextMenuItems(params) { 
    console.log(params);
    var result = [
        { // custom item
            name: 'Sample',
            action: function () { params.context.thisComponent.callMe(); },
            icon: '<i class="fa fa-pencil" />'
        }];
    return result;
}

Same can be done for any other call backs like cellRenderer.

reference: Scoping issues while using context menu

Its worked for me

hussain
  • 432
  • 5
  • 7