TypeScriptを使用してangular2でag-gridを試していますが、何らかの理由でag-grid APIを使用できず、未定義のエラーが発生します。
ここにコードがあります。
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()
{
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}
}//constructor
アドバイスしてください、ありがとう
以下のコメントのコードで更新
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
}
}
2つの問題...
最初に、他の人が述べたように、onGridReadyでグリッドAPIへの参照を初期化します。
_onGridReady(params) {
this.gridApi = params.api;
}
_
第2に、ag-gridが提供されたハンドラーの1つ(例:rowClicked)を呼び出すと、this
はangularコンポーネントインスタンスではなくなるため、testClick()
でメソッド_this.gridOptions === undefined
_。
AgGridイベントコールバックでangularコンポーネントのプロパティにアクセスするには、次のように_GridOptions.context
_を介してthis
を渡す必要があります。
_this.gridOptions = <GridOptions>{
context: {parentComponent: this},
...other lines
_
AgGridのイベントは、(一般的には)イベントパラメータでこのコンテキストオブジェクトへの参照を返します。
_rowClicked(rowClicked: RowClickedEvent) {
const localGridApiRef = rowClicked.context.parentComponent.gridApi;
// do stuff with the grid api...
const selectedRows = localGridApiRef.getSelectedRows();
};
_
注:testClick()
の使い方はわかりませんが、私のrowClicked()
は交換可能です。
注2-GridApi
は実際にはRowClickedEvent
のプロパティであるため、示されているようにコンテキストオブジェクトを介して取得する必要はありませんが、プロパティにアクセスするポイントを示しています/ agグリッドイベントのangularコンポーネントのメソッドは、AgGridEvent
のcontext
プロパティを介して実行できます。
グリッドのgridOptions
イベントが呼び出されると、gridReady
APIが設定され、使用できるようになります。
テストしている行では、gridOptions
は空のオブジェクトです。これを行った後でも、次のようになります。
this.gridOptions = <GridOptions>{
columnDefs: this.columnDefs(),
...other lines
それでもAPIは利用できません。gridReady
またはAngularのngOnInit
イベントにフックすれば、APIを安全に呼び出すことができます。
コンポーネントのライフサイクルが原因です。 constructor
ではまだ初期化されていません。 (私はあなたがgridOptionsオブジェクトをあなたのグリッドに適切に割り当てたと仮定しています。)
それを使ってみてください
ngOnInit() {
console.log(this.gridOptions.api)
}
ドキュメントから
ngOnInit Angularの後にディレクティブ/コンポーネントを初期化します。最初にデータバインドプロパティを表示し、ディレクティブ/コンポーネントの入力プロパティを設定します。
ライフサイクルに関する詳細情報を取得 ここ 。
AngularJSを使用しているときに、これに関する答えを探していました。 (AngularJS固有の問題ではありませんでしたが)私と同じ問題に終わった他の人にとっては、HTMLでテーブルを正しく呼び出していなかったことがわかりました。テーブルが呼び出されなかったため、APIがセットアップされず、gridReadyが実行されませんでした。私が使用した構文はうまくいきました:
<div class="table-body">
<div ag-grid="$ctrl.gridOptions" class="ag-theme-fresh ag-grid-container"></div>
</div>
これを試してください:
export class MyComponent implements OnInit {
selected = () => console.log('ID: ', this.gridOptions.api.getSelectedRows()[0].id);
gridOptions: GridOptions = {
columnDefs: [
{headerName: 'ID', field: 'id', width: 80},
{ ... }
],
rowSelection: 'single'
}
ngOnInit() {
this.gridOptions.rowData = this.gridData;
this.gridOptions.onSelectionChanged - this.selected;
}
それは私のために働いた!
私はvue.jsを使用していました同じ問題がありました。しかし、問題を解決したag-grid-vueコンポーネントに:gridOptions = "gridOptions"を含めた場合