Angular Data GridCustom Components
angular logo

The full list of component types you can provide in AG Grid are as follows:

The remainder of this page gives information that is common across all the component types.

Registering Custom Components

There are two ways to register custom components:

  • Direct reference.
  • By name.

1. By Direct Reference

When registering an Angular Component by reference you simply pass the Component to the place you want it used (i.e. Cell Renderer, Filter etc).

In this example we're specifying that we want our Angular CubeComponent as a Cell Renderer in the Cube column:

//...other imports
import { Component } from '@angular/core';
import { CubeComponent } from './cube.component';

@Component({
selector: 'app-root',
template: `
   <ag-grid-angular [columnDefs]="columnDefs"
                    ...other properties>
   </ag-grid-angular>
`
})
export class AppComponent {
   columnDefs: [
       {
           field: "cube",
           cellRenderer: CubeComponent,     
       }
   ]

   //...other properties & methods
}

The advantage of referencing Components directly is cleaner code, without the extra level of indirection added when referencing by name.

2. By Name

When registering an Angular component by name you need to first register the component within the grid components property, then reference the component by name where you want it used (i.e. as a Cell Renderer, Filter etc).

In this example we've registered our Angular CubeComponent and given it a name of cubeComponent (this can be any name you choose). We then specify that we want the previously registered cubeComponent to be used as a Cell Renderer in the Cube column:

//...other imports
import { Component } from '@angular/core';
import { CubeComponent } from './cube.component';

@Component({
selector: 'app-root',
template: `
   <ag-grid-angular [columnDefs]="columnDefs" [components]="components"
                    ...other properties>
   </ag-grid-angular>
`
})
export class AppComponent {
   components = {
       'cubeComponent': CubeComponent
   };          
   columnDefs = [
       {
           field: "cube",
           cellRenderer: 'cubeComponent',     
       }
   ]

   //...other properties & methods
}

The advantage of referencing components by name is definitions (eg Column Definitions) can be composed of simple types (ie JSON), which is useful should you wish to persist Column Definitions.

Providing Additional Parameters

Each Custom Component gets a set of parameters from the grid. For example, for Cell Renderer the grid provides, among other things, the value to be rendered. You can provide additional properties to the Custom Component (e.g. what currency symbol to use) by providing additional parameters specific to your application.

To provide additional parameters, use the property [prop-name]Params, e.g. cellRendererParams.

<ag-grid-angular
    [columnDefs]="columnDefs"
    /* other grid options ... */>
</ag-grid-angular>

this.columnDefs = [
    { 
        field: 'price',
        cellRenderer: PriceCellRenderer,
        cellRendererParams: {
            currency: 'EUR'
        }
    },
];

Component Lifecycle Hook agInit

Each custom Angular component must implement the agInit(params) lifecycle hook. AgInit is called by AG Grid before any of the Angular Lifecycle hooks, including ngOnInit. This order is deterministic and applies to all component types.

Mixing JavaScript and Angular

When providing Custom Components you have a choice of the following:

  1. Provide an AG Grid component as an Angular Component.
  2. Provide an AG Grid component in JavaScript.

The following code snippet shows how both JavaScript and Angular Components can be used at the same time:

//...other imports
import { Component } from '@angular/core';
import JavascriptComponent from './JavascriptComponent.js';
import { AngularComponent }  from './angular.component';

@Component({
selector: 'app-root',
template: `
   <ag-grid-angular [columnDefs]="columnDefs" [components]="components"
                    ...other properties>
   </ag-grid-angular>
`
})
export class AppComponent {
   // JS and Angular components, only need register if looking up by name
   components = {
       'javascriptComponent': JavascriptComponent,
       'angularComponent': AngularComponent
   };
   columnDefs = [
       {
           headerName: "JS Cell",
           field: "value",
           cellRenderer: 'javascriptComponent', // JS comp by Name
       },
       {
           headerName: "JS Cell",
           field: "value",
           cellRenderer: JavascriptComponent, // JS comp by Direct Reference
       },
       {
           headerName: "Angular Cell",
           field: "value",
           cellRenderer: 'angularComponent', // Angular comp by Name
       },
       {
           headerName: "Angular Cell",
           field: "value",
           cellRenderer: AngularComponent, // Angular comp by Direct Reference
       }
   ];

   //...other properties & methods
}

Javascript components are run outside of NgZone. If they initiate calls into your Angular application you may need to wrap these calls within ngZone.run() for Change Detection to correctly run.

Change the documentation view to JavaScript to see how to create a plain JavaScript component.

Component Usage

The below table gives a summary of the components, where they are configured and using what attribute.

ComponentWhereAttribute
Cell RendererColumn DefinitioncellRenderer
cellRendererParams
cellRendererSelector
Cell EditorColumn DefinitioncellEditor
cellEditorParams
cellEditorSelector
FilterColumn Definitionfilter
filterParams
Floating FilterColumn DefinitionfloatingFilter
floatingFilterParams
Header ComponentColumn DefinitionheaderComponent
headerComponentParams
Header Group ComponentColumn DefinitionheaderGroupComponent
headerGroupComponentParams
Tooltip ComponentColumn DefinitiontooltipComponent
tooltipComponentParams
Group Row Cell RendererGrid OptiongroupRowRenderer
groupRowRendererParams
Group Row Inner Cell RendererGrid OptioninnerRenderer
innerRendererParams
Detail Cell RendererGrid OptiondetailCellRenderer
detailCellRendererParams
Full Width Cell RendererGrid OptionfullWidthCellRenderer
fullWidthCellRendererParams
Loading Cell RendererGrid OptionloadingCellRenderer
loadingCellRendererParams
Loading OverlayGrid OptionloadingOverlayComponent
loadingOverlayComponentParams
No Rows OverlayGrid OptionnoRowsOverlayComponent
noRowsOverlayComponentParams
Date ComponentGrid OptiondateComponent
dateComponentParams
Status Bar ComponentGrid Option -> Status BarstatusPanel
statusPanelParams
Tool PanelGrid Option -> Side BartoolPanel
toolPanelParams
Menu ItemGrid Option -> MenumenuItem
menuItemParams

Grid Provided Components

The grid comes with pre-registered components that can be used. Each component provided by the grid starts with the namespaces 'ag' to minimise naming conflicts with user provided components. The full list of grid provided components are in the table below.

Date Inputs

agDateInputDefault date input used by filters.

Column Headers

agColumnHeaderDefault column header.
agColumnHeaderGroupDefault column group header.

Column Filters

agSetColumnFilterSet filter (default when using AG Grid Enterprise).
agTextColumnFilterSimple text filter (default when using AG Grid Community).
agNumberColumnFilterNumber filter.
agDateColumnFilterDate filter.
agMultiColumnFilterMulti filter.
agGroupColumnFilterGroup column filter.

Floating Filters

agSetColumnFloatingFilterFloating set filter.
agTextColumnFloatingFilterFloating text filter.
agNumberColumnFloatingFilterFloating number filter.
agDateColumnFloatingFilterFloating date filter.
agMultiColumnFloatingFilterFloating multi filter.
agGroupColumnFloatingFilterFloating group column filter.

Cell Renderers

agAnimateShowChangeCellRendererCell renderer that animates value changes.
agAnimateSlideCellRendererCell renderer that animates value changes.
agGroupCellRendererCell renderer for displaying group information.
agLoadingCellRendererCell renderer for loading row when using Enterprise row model.
agCheckboxCellRendererCell renderer that displays a checkbox for boolean values.

Overlays

agLoadingOverlayLoading overlay.
agNoRowsOverlayNo rows overlay.

Cell Editors

agTextCellEditorText cell editor.
agSelectCellEditorSelect cell editor.
agRichSelectCellEditorRich select editor.
agLargeTextCellEditorLarge text cell editor.
agNumberCellEditorNumber cell editor.
agDateCellEditorDate cell editor.
agDateStringCellEditorDate represented as string cell editor.
agCheckboxCellEditorCheckbox cell editor.

Master Detail

agDetailCellRendererDetail panel for master / detail grid.

Column Menu / Context Menu

agMenuItemMenu item within column or context menu

Overriding Grid Components

It is also possible to override components. Where the grid uses a default value, this means the override component will be used instead. The default components, where overriding makes sense, are as follows:

  • agDateInput: To change the default date selection across all filters.
  • agColumnHeader: To change the default column header across all columns.
  • agColumnGroupHeader: To change the default column group header across all columns.
  • agLoadingCellRenderer: To change the default loading cell renderer for Enterprise Row Model.
  • agLoadingOverlay: To change the default 'loading' overlay.
  • agNoRowsOverlay: To change the default loading 'no rows' overlay.
  • agCellEditor: To change the default cell editor.
  • agDetailCellRenderer: To change the default detail panel for master / detail grids.
  • agMenuItem: To change the default menu item for column and context menus.

To override the default component, register the custom component in the GridOptions components property under the above name.

@Component({
    selector: 'my-app',
    template: `
      <ag-grid-angular
          class="ag-theme-quartz"
          [components]="components"
          ...other properties...  
      ></ag-grid-angular>
    `
})
export class AppComponent {
    // Here is where we specify the components to be used instead of the default
    public components = {
        agDateInput: CustomDateComponent,
        agColumnHeader: CustomHeaderComponent
    };