I am trying ag-grid in angular2 with typescript, for some reasons I am not able to use the ag-grid APIs, getting undefined error.,
here is the code:
import { AgRendererComponent } from 'ag-grid-ng2/main';
import { GridOptions, RowNode } from 'ag-grid/main';
import { GridOptionsWrapper } from 'ag-grid/main';
import { GridApi } from 'ag-grid/main';
public gridOptions: GridOptions;
/**
* Constructor
*/
constructor()
{
this.gridOptions = <GridOptions>{};
alert(this.gridOptions);
alert(this.gridOptions.api); // *** getting undefined ***
this.gridOptions = <GridOptions>{
columnDefs: this.columnDefs(),
rowData: this.rowData,
onSelectionChanged: this.onSelectionChanged,
groupSelectsChildren: true,
suppressRowClickSelection: true,
rowSelection: 'multiple',
enableColResize: true,
enableSorting: true,
rowHeight: 45}
}
Please advise, Thanks
Updated with code in comment below
onGridReady() {
console.log(this.gridOptions.api); // here it work
this.selectedRows = this.gridOptions.api.getSelectedRows();
console.log(this.selectedRows);
}
private testClick(event): void {
try {
console.log(this.gridOptions.api); // here gives error
this.selectedRows = this.gridOptions.api.getSelectedRows();
console.log(this.selectedRows); //getting error saying undefined
}
}
Access the Grid & Column API You can access the APIs in the following ways: Store them from the gridReady event - they'll be available via the params argument passed into the event. Provide a gridOptions object to the grid pre-creation time. Post-creation the APIs will be available on the gridOptions object.
Access the Grid & Column API If you want to use the APIs of the grid, you can put an onGridReady(params) callback onto the grid and grab the api(s) from the params. Alternatively, you can retrieve the grid component with a @ViewChild attribute from within your component.
Grid Options The gridOptions object is a 'one stop shop' for the entire interface into the grid, commonly used if using plain JavaScript. Grid options can however be used instead of, or in addition to, normal framework bindings.
Two issues...
First ,as others have mentioned, initialise a reference to the grid api in onGridReady like so
onGridReady(params) {
this.gridApi = params.api;
}
Secondly, when ag-grid calls one of your provided handlers (E.g. rowClicked), this
is no longer your angular component instance, so in your testClick()
method this.gridOptions === undefined
.
To access properties of your angular component in an AgGrid Event callback you should pass this
via GridOptions.context
like this:
this.gridOptions = <GridOptions>{
context: {parentComponent: this},
...other lines
AgGrid's events (generally) return a reference to this context object in the Event params..
rowClicked(rowClicked: RowClickedEvent) {
const localGridApiRef = rowClicked.context.parentComponent.gridApi;
// do stuff with the grid api...
const selectedRows = localGridApiRef.getSelectedRows();
};
Note: I'm not sure how you used testClick()
but my rowClicked()
would be interchangeable I expect...
Note 2 - The GridApi
is actually a property of RowClickedEvent
, so while getting it via the context object as shown is superfluous, it illustrates the point that accessing properties/methods of your angular component in an ag grid event can be done via AgGridEvent
's context
property.
The gridOptions
api will be set and ready to use once the grid's gridReady
event has been called.
At the line you're testing for it, gridOptions
is just an empty Object, and even after you do this:
this.gridOptions = <GridOptions>{
columnDefs: this.columnDefs(),
...other lines
It still won't have the api available - hook into the gridReady
or angular's ngOnInit
events and you'll be able to invoke the api safely.
It's because of component lifecycles. In constructor
it's not initialized yet. (I'm assuming you assigned gridOptions object to your grid properly.)
Try using it in
ngOnInit() {
console.log(this.gridOptions.api)
}
From the documentation
ngOnInit Initialize the directive/component after Angular first displays the data-bound properties and sets the directive/component's input properties.
Get more info about lifecycles here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With