当行悬停在 ag-grid 中时,在单元格中呈现附加信息

Posted

技术标签:

【中文标题】当行悬停在 ag-grid 中时,在单元格中呈现附加信息【英文标题】:Render additional info in cell when row is hovered in ag-grid 【发布时间】:2020-04-28 21:54:11 【问题描述】:

我正在使用 angular (^8.2.14) 和 ag-grid-community (^20.1.0)。

我尝试实现以下效果:当用户将鼠标悬停在特定行时,其中一列会显示一个可以点击的附加按钮。

什么有效? 具有所需行为的列由实现 ICellRendererAngularComponent 接口的自定义单元格渲染器组件渲染。在那里我可以注入 ElementRef 并在生命周期钩子AfterContentChecked 上检查父级的 css 类“ag-row-hover”,如果它在那里,我将在渲染器组件中显示这个附加按钮。

custom-cell.component.ts

@Component(
  selector: 'app-custom-cell',
  template: `
      <ng-container *ngIf="hovered; else notHovered">form.value * form.value
        <button (click)="doStuff(form.value)">show root</button></ng-container>
      <ng-template #notHovered>form.value + form.value</ng-template>
  `,
)
export class CustomCellComponent implements ICellRendererAngularComp, AfterContentChecked 
  form: FormControl;
  params: ICellRendererParams;
  hovered = false;

  constructor(private elementRef: ElementRef) 
  

  doStuff(val) 
    alert(val);
  

  ngAfterContentChecked() 
    this.hovered = (this.elementRef.nativeElement as htmlElement)
      .parentElement
      .parentElement
      .classList.contains('ag-row-hover');
  

源代码在github

我想改进什么? 我想提高性能,而不是对这种行为进行明确的检查。我宁愿有一个带有 css-selector '.ag-row' 的指令,我可以将它注入到 ICellRendererAngularComponent 中,然后在每次检查时检查 css 类 '.ag-row-hover'。或者有一个带有 css-selector '.ag-row-hover' 的指令,它存在或不存在。任何人都知道如何改进我现有的解决方案?

【问题讨论】:

【参考方案1】:

您实际上可以仅使用 CSS 实现所需的行为,无需注入 ElementRef 或通过 Angular Lifecycle Callbacks 执行任何操作。

话虽如此,您的自定义渲染器可能看起来像这样:

@Component(
  selector: "app-custom-cell",
  template: `
    <span style="color: red;">
      <div class="visible-on-hover">
         form.value * form.value 
        <button (click)="doStuff(form.value)">show root</button>
      </div>
      <div class="hidden-on-hover"> form.value + form.value </div>
    </span>
  `
)
export class CustomCellComponent
  implements ICellRendererAngularComp 
  form: FormControl;
  params: ICellRendererParams;

  constructor() 

  doStuff(val) 
    alert(val);
  

//... other stuff 


在你的styles.scss(或者更合适的地方,只是make sure the styles apply)中,添加这些规则:

div.visible-on-hover 
  display: none;


.ag-row-hover 
  div.visible-on-hover 
    display: block;
  

  div.hidden-on-hover 
    display: none;
  


从概念上讲,浏览器渲染引擎会执行您在 ngAfterContentChecked() 中所做的操作。

【讨论】:

感谢您提供此线索。它解决了有关使用 Angular 的生命周期钩子的问题,并且可能是一种更好的解决方案 - 性能方面。

以上是关于当行悬停在 ag-grid 中时,在单元格中呈现附加信息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ag-grid 中添加与单元格中的数据相同的默认 headerTooltip?

部分显示ag-grid单元内的Bootstrap工具提示

如何在单个 ag-grid 单元格中显示两列值?

如何在角度的 ag-grid 单元格中应用自定义 css 类?

如何在 ag-grid 中捕获行悬停事件?

如何在 ag-grid 中的单元格中使用和添加图标以指示该单元格是可编辑的