在ag-grid内安装手风琴手风琴

如何解决在ag-grid内安装手风琴手风琴

我有一个相当标准的带有嵌套组件的ag-grid设置,如下所示:

import { Component } from '@angular/core';
import * as agGrid from 'ag-grid-community';
import { NestedMatExpansionPanelComponent } from './nested-mat-expansion-panel/nested-mat-expansion-panel.component';

@Component({
  selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'aggrid-material-expansion-panel';

  dataToShow = [
    { name: 'name1',companyCountry: 'UK',reference: 'Ref 1' },{ name: 'name2',companyCountry: 'Germany',reference: 'Ref 2' },{ name: 'name3',companyCountry: 'France',reference: 'Ref 3' },{ name: 'name4',reference: 'Ref 4' },{ name: 'name5',companyCountry: 'USA',reference: 'Ref 5' },];

  columnDefs = [
    // tslint:disable-next-line: max-line-length
    { headerName: 'Name',colId: 'name',cellRenderer: 'nestedMatExpansionPanelRenderer',filter: false,sortable: false },{ headerName: 'Country',field: 'companyCountry',sortable: true,filter: true },{ headerName: 'Reference',field: 'reference',filter: true }
  ];

  // agG_rid
  gridApi: agGrid.GridApi;
  gridColumnApi: agGrid.ColumnApi;
  gridOptions: agGrid.GridOptions = {};
  public defaultColDef: any;
  public columnTypes: any;
  public context: any;
  public frameworkComponents: any;
  public sortingOrder: any;

  constructor() {
    this.initTable();
  }

  public onGridReady(params: any) {
    // this.gridApi = this.gridOptions.api;
    // this.gridColumnApi = this.gridOptions.columnApi;
    this.gridApi = params.api;
    this.gridColumnApi = params.columnApi;

    this.gridApi.sizeColumnsToFit();
  }

  public initTable(): void {
    this.defaultColDef = {
      flex: 1,autoHeight: true,editable: false,enableBrowserTooltips: true,resizable: true,filter: 'agTextColumnFilter',suppressMenu: true,floatingFilterComponentParams: { suppressFilterButton: true },filterParams: { newRowsAction: 'keep' },};
    this.columnTypes = {
      numericColumn: { filter: 'agnumericColumnFilter' },dateColumn: {
        filter: 'agDateColumnFilter',filterParams: {
          newRowsAction: 'keep',comparator(filterLocalDateAtMidnight,cellValue) {
            const dateParts = cellValue.split('/');
            const day = Number(dateParts[2]);
            const month = Number(dateParts[1]) - 1;
            const year = Number(dateParts[0]);
            const cellDate = new Date(day,month,year);
            if (cellDate < filterLocalDateAtMidnight) {
              return -1;
            } else if (cellDate > filterLocalDateAtMidnight) {
              return 1;
            } else {
              return 0;
            }
          }
        }
      }
    };
    this.sortingOrder = ['desc','asc'];
    this.context = { componentParent: this };
    this.frameworkComponents = {
      nestedMatExpansionPanelRenderer: NestedMatExpansionPanelComponent,};
  }

  public onRowClicked($event) {
    //
  }

}

您可以看到我有

  autoHeight: true,

因此,每行应根据嵌入的手风琴的扩展状态自动获得正确的高度,但该行的输出高度计算错误:

Redundant space

如何根据嵌入式扩展面板的状态自动调整每行的高度,以便在打开或关闭每行内部的扩展面板时不会有多余的空白空间?

Link to the repository

解决方法

基本上,您遇到的问题是MatExpansionPanel和如何在ag-grid中计算autoHeight的综合问题。

使用autoHeight,他们从单元格中取出内容,并将其放在临时的不可见元素中,可能位于document.body元素中。问题在于,此时此元素尚未应用适当的样式,它显示了您面对的高度。因此,autoHeight不是这里的解决方案,应将其设置为false

那么如何实现手动高度计算。 Ag-grid在setRowHeight上具有node属性。您可以用来设置高度。从那里需要通知网格API,所有行的高度都已更改,可以通过调用onRowHeightChanged()在此基础上重新计算。获得这种通信的一种方法是使用普通服务:

@Injectable()
export class GridService {
  readonly updateHeight$ = new Subject<void>();
}

在您在模板中创建ag-grid的组件中,应将此服务器添加到providers数组并收听主题(带有反跳以确保最初计算所有行):

@Component({
  // ...,providers: [GridService]
})
export class GridComponent {
  gridApi: agGrid.GridApi;

  constructor(private gs: GridService) {
    this.gs.updateHeight$.pipe(
      debounceTime(1)
    ).subscribe(() => {
      this.gridApi?.onRowHeightChanged();
    });
  }

  onGridReady(params: any) {
    this.gridApi = params.api;
  }
}

现在,在单元格渲染器框架组件中需要以下逻辑:

export class ExpansionPanelComponent implements ICellRendererAngularComp,AfterViewInit {
  public params: ICellRendererParams;

  constructor(private el: ElementRef<HTMLElement>,private gs: GridService) {}

  agInit(params: ICellRendererParams): void {
    this.params = params;
  }

  ngAfterViewInit(): void {
    // inside setTimeout because the accordion is not properly sized (bug) and it will be too big
    setTimeout(() => this.updateHeight());
  }

  updateHeight(): void {
    // inside setTimeout because the accordion is not properly sized (bug) and it will be too big
    setTimeout(() => {
      this.params?.node.setRowHeight(this.el.nativeElement.offsetHeight);
      this.gs.updateHeight$.next();
    });
  }

  refresh(params: any): boolean {
    return false;
  }
}

我创建了一个有效的提取请求here


要删除左侧的填充,可以将以下内容添加到columnDefs数组中:

columnDefs = [
  {
    //...,cellRenderer: 'nestedMatExpansionPanelRenderer',cellStyle: { 'padding-left': 0 }
  },// ...
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-