4

Ag-grid は、テーブルが最初に非同期取得されたデータを受け取るときに、ngOnChanges を使用して defaultColDef フォーマット (cellStyle および cellRenderer) を完全に適用します。ただし、グリッドを含むコンポーネントが非表示になり、*ngIf 条件によって再初期化された場合、テーブルには正しいデータが再入力されますが、前と同じように ngOnChanges が再びトリガーされても、defaultColDef フォーマットは再適用されません。this.gridOptions.defaultColDef = this.defaultColDef;ngOnChanges の onGridReady コールバック内に設定されており、デバッグ中に this.defaultColDef が正しいオブジェクトとして定義されていることがわかります。

これは、this.defaultColDef が ngOnInit() で再定義され、さらに ngOnChanges() で再定義された場合でも同様です (簡潔にするために、以下のサンプル コードのコンストラクターに含まれています)。また、onGridReady: (params) 呼び出し全体が ngOnInit() 内で繰り返される場合も同様です。

代わりに、親で columnDefs オブジェクトが構築されるときに、同じ cellStyle および cellRenderer がプロパティとして columnDefs に割り当てられる場合、グリッド コンポーネントが非表示になり、再表示 (再初期化) されるときに、書式設定が正しく適用されます。

 export class ResultsTableComponent implements OnInit, OnChanges {
 @Input() label;
 gridOptions: GridOptions ;
 gridApi;
defaultColDef;

 get query(): string {
     return this.searchService.query;
 };
 get rowData() {
     return this.searchService.rowDataForAgGrid;
 };
 @Input()
 set rowData(value) {
     this.searchService.rowDataForAgGrid=value;
 };
 get columnDefs() {
     return this.searchService.columnDefsForGrid;
 };
 @Input()
 set columnDefs(value) {
     this.searchService.columnDefsForGrid=value;
 };

 constructor(private searchService: SearchService) {

   this.defaultColDef = {
     editable: true,
     cellStyle: function(params) {
       if (params.value == 'FAIL') {
           return {color: 'white', backgroundColor: 'red',  textAlign: 'center'};
       }  if (params.value == 'PASS') {
         return {color: 'white', backgroundColor: 'forestgreen', textAlign: 'center'};
       }  if (params.value == 'SKIP') {
         return {color: 'white', backgroundColor: 'royalblue', textAlign: 'center'};
       }  if (params.value == 'NOT RUN') {
         return {color: 'white', backgroundColor: 'lightgray', textAlign: 'center'};
       } else {
           return null;
       }
     },
     cellRenderer: function (params) {
     if (params.value && (typeof params.value == 'string') &&  params.value.includes('http://')) {
         return `<a href='${params.value}' >${params.value}</a>` ;
     } else if (params.colDef.field.includes('name')) {
         return `<a href='/Detail.html?id=${params.data.DocumentId}'  target='_blank'>${params.value}</a>` ;
     } else if (params.colDef.field.includes('DocumentId')) {
       return `<a href='/Triage.html?id=${params.data.DocumentId}' target='_blank'>${params.value}</a>` ;
     } else {
          return params.value;}
       },
 };
   this.gridOptions = <GridOptions>{
     columnDefs: [],
     rowData: [],
     defaultColDef: this.defaultColDef,
     groupSelectsChildren: true,
     suppressRowClickSelection: true,
     rowSelection: 'multiple',
     enableColResize: true,
     enableSorting: true,
     enableFilter: true,
     rowHeight: 45,
     isExternalFilterPresent: this.isExternalFilterPresent,
     doesExternalFilterPass: this.doesExternalFilterPass,
   };
   this.gridOptions = {
     onGridReady: (params) =>  setTimeout(function(){
       this.gridApi = params.api,0
     }),
   };
   this.label = 'all';
 }

 ngOnInit() {
}

 ngOnChanges(changes: SimpleChanges) {

   this.gridOptions = {
     onGridReady: (params) => {
       this.gridApi = params.api;
       this.gridOptions.api.setRowData(this.rowData);
       this.gridOptions.defaultColDef = this.defaultColDef;
       this.gridOptions.api.setColumnDefs(this.columnDefs);
       this.gridOptions.api.refreshHeader();
       this.gridOptions.api.refreshCells({force : true});
       this.gridOptions.isExternalFilterPresent  =     this.isExternalFilterPresent.bind(this);
       this.gridOptions.doesExternalFilterPass = this.doesExternalFilterPass.bind(this)
      },
     rowSelection: 'multiple',
     enableColResize: true,
     enableSorting: true,
     enableFilter: true,
   };
  if (changes.label && changes.label.currentValue != changes.label.previousValue) {
     this.externalFilterChanged(this.label);
   }
 }

実際の結果: コンポーネントの再初期化後に列と行が正しく入力されますが、defaultColDef は適用されません。

期待される結果: hide->show 後のコンポーネントの再初期化後に defaultColDef が適用されます。

4

0 に答える 0