Angular Data Grid

Creating a Basic Grid

angular logo

An introduction to the key concepts of AG Grid.

Overview

In this tutorial you will:

  1. Create a basic grid
  2. Load external data into the grid
  3. Configure columns
  4. Configure grid features
  5. Format cell values
  6. Add custom components to cells
  7. Hook into grid events

Once complete, you'll have an interactive grid, with custom components and formatted data - Try it out for yourself by sorting, filtering, resizing, selecting, or editing data in the grid:

Create a Basic Grid

Complete our Quick Start (or open the example below in CodeSandbox / Plunker) to start with a basic grid, comprised of:

  1. Row Data: The data to be displayed.
  2. Column Definition: Defines & controls grid columns.
  3. Grid Component: The ag-grid-angular component, with Dimensions, CSS Theme, Row Data, and Column Definition attributes

Load New Data

As rowData is a managed property, any updates to its value will be reflected in the grid. Let's test this by fetching some data from an external server with Angular's HttpClient and updating rowData with the response.

First we need to hook into the gridReady event by adding (gridReady)="onGridReady($event)" to the ag-grid-angular component:

<!-- The AG Grid component, with various Grid Option properties -->
<ag-grid-angular
 style="width: 100%; height: 550px;"
 class="ag-theme-quartz-dark"
 [rowData]="rowData"
 [columnDefs]="colDefs"
 (gridReady)="onGridReady($event)"
>
</ag-grid-angular>

Note: Grid Events are covered in more detail later on

And then executing a HTTP request when the onGridReady event is fired, subscribing to the result to update our rowData asynchronously:

// Load data into grid when ready
onGridReady(params: GridReadyEvent) {
 this.http
   .get<any[]>('https://www.ag-grid.com/example-assets/space-mission-data.json')
   .subscribe(data => this.rowData = data);
}

Finally, now that we're loading data from an external source, we can empty our rowData array (which will allow the grid to display a loading spinner whilst the data is being fetched) and update our colDefs to match the new dataset:

export class AppComponent {
 // Row Data: The data to be displayed.
 rowData: IRow[] = [];
 colDefs: ColDef[] = [
   { field: "mission" },
   { field: "company" },
   { field: "location" },
   { field: "date" },
   { field: "price" },
   { field: "successful" },
   { field: "rocket" }
 ];
 // ...
}

When we run our application, we should see a grid with ~1,400 rows of new data, and new column headers to match:

Note: All Grid Option properties tagged as 'managed' are automatically updated when their value changes.


Configure Columns

Now that we have a basic grid with some arbitrary data, we can start to configure the grid with Column Properties.

Column Properties can be added to one or more columns to enable/disable column-specific features. Let's try this by adding the filter: true property to the 'mission' column:

colDefs: ColDef[] = [
 { field: "mission", filter: true },
 // ...
];

We should now be able to filter the 'mission' column - you can test this by filtering for the 'Apollo' missions:

Note: Column properties can be used to configure a wide-range of features; refer to our Column Properties page for a full list of features.

Default Column Definitions

The example above demonstrates how to configure a single column. To apply this configuration across all columns we can use Default Column Definitions instead. Let's make all of our columns filterable by creating a defaultColDef object, setting filter: true, and passing this to our template:

@Component({
 template:
 `
 <div class="content">
   <ag-grid-angular
     ...
     [defaultColDef]="defaultColDef"
   >
   </ag-grid-angular>
 </div>
 `,
 // ...
})

export class AppComponent {
 // Default Column Definitions: Apply configuration across all columns
 defaultColDef: ColDef = {
   filter: true
 }
 // ...
}

The grid should now allow filtering on all columns:

Note: Column Definitions take precedence over Default Column Definitions


Configure The Grid

So far we've covered creating a grid, updating the data within the grid, and configuring columns. This section introduces Grid Options, which control functionality that extends across both rows & columns, such as Pagination and Row Selection.

Grid Options are passed to the grid via attributes on the ag-grid-angular component. Let's enable pagination by adding [pagination]="true":

<!-- The AG Grid component, with various Grid Option properties -->
<ag-grid-angular
 ...
 [pagination]="true"
>
</ag-grid-angular>

We should now see Pagination has been enabled on the grid:

Refer to our detailed Grid Options documentation for a full list of options.


Format Cell Values

The data supplied to the grid usually requires some degree of formatting. For basic text formatting we can use Value Formatters.

Value Formatters are basic functions which take the value of the cell, apply some basic formatting, and return a new value to be displayed by the grid. Let's try this by adding the valueFormatter property to our 'price' column and returning the formatted value:

colDefs: ColDef[] = [
 {
   field: "price",
   valueFormatter: params => { return '£' + params.value.toLocaleString(); } // Format with inline function
 },
 // ...
];

The grid should now show the formatted value in the 'price' column:

Note: Read our Value Formatter page for more information on formatting cell values


Custom Cell Components

Value Formatters are useful for basic formatting, but for more advanced use-cases we can use Cell Renderers instead.

Cell Renderers allow you to use your own components within cells. To use a custom component, add the cellRenderer prop to a column and set the value to the name of your component.

Let's try this by creating a new component to display the company logo in the 'company' column:

// Custom Cell Renderer Component
@Component({
 selector: 'app-company-logo-renderer',
 standalone: true,
 imports: [CommonModule],
 template: `<span *ngIf="value" ><img [alt]="value" [src]="'https://www.ag-grid.com/example-assets/space-company-logos/' + value.toLowerCase() + '.png'" /> <p>{{ value }}</p></span>`,
 styles: ["img {display: block; width: 25px; height: auto; max-height: 50%; margin-right: 12px; filter: brightness(1.2);} span {display: flex; height: 100%; width: 100%; align-items: center} p { text-overflow: ellipsis; overflow: hidden; white-space: nowrap }"]
})

export class CompanyLogoRenderer implements ICellRendererAngularComp {
 // Init Cell Value
 public value!: string;
 agInit(params: ICellRendererParams): void {
   this.value = params.value;
 }

 // Return Cell Value
 refresh(params: ICellRendererParams): boolean {
   this.value = params.value;
   return true;
 }
}

And then adding the cellRenderer prop on our 'company' column to use our component:

colDefs: ColDef[] = [
 {
   field: "company",
   cellRenderer: CompanyLogoRenderer // Render a custom component
 }
 // ...
];

Now, when we run the grid, we should see a company logo next to the name:

Note: Read our Cell Components page for more information on using custom components in cells


Handle Grid Events

In the last section of this tutorial we're going to hook into events raised by the grid using Grid Events.

To be notified of when an event is raised by the grid we need to add the relevant event name attribute to the ag-grid-angular component.

Let's try this out by enabling cell editing with editable: true on the Default Column Definitions:

// Default Column Definitions: Apply configuration across all columns
defaultColDef: ColDef = {
 editable: true
 // ...
}

Next, lets create a function to handle the event:

// Handle cell editing event
onCellValueChanged = (event: CellValueChangedEvent) => {
 console.log(`New Cell Value: ${event.value}`)
}

Finally, let's add the gridReady attribute to the ag-grid-angular component, with the value as the function we've just created:

<!-- The AG Grid component, with various Grid Option properties -->
<ag-grid-angular
 (gridReady)="onGridReady($event)"
 ...
>
</ag-grid-angular>

Now, when we click on a cell we should be able to edit it and see the new value logged to the console:

Refer to our Grid Events documentation for a full list of events raised by the grid


Test Your Knowledge

Let's put what you've learned so far into action by modifying the grid:

  1. Enable Checkbox Selection on the 'mission' column

    Hint: checkboxSelection is a Column Definition property

  2. Enable multiple row selection

    Hint: rowSelection is a Grid Option property

  3. Log a message to the console when a row selection is changed

    Hint: onSelectionChanged is a Grid Event

  4. Format the Date column using .toLocaleDateString();

    Hint: Use a valueFormatter on the 'Date' column to format its value

  5. Add a Cell Renderer to display ticks and crosses in place of checkboxes on the 'Successful' column:

    Hint: Use a cellRenderer on the 'successful' column

Once complete, your grid should look like the example below. If you're stuck, check out the source code to see how its done:


Summary

Congratulations! You've completed the tutorial and built your first grid. By now, you should be familiar with the key concepts of AG Grid:

  • Row Data: Your data, in JSON format, that you want the grid to display.

  • Column Definitions: Define your columns and control column-specific functionality, like sorting and filtering.

  • Default Column Definitions: Similar to Column Definitions, but applies configurations to all columns.

  • Grid Options: Configure functionality which extends across the entire grid.

  • Grid Events: Events raised by the grid, typically as a result of user interaction.

  • Value Formatters: Functions used for basic text formatting

  • Cell Renderers: Add your own components to cells

Next Steps

Browse our guides to dive into specific features of the grid: