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

Render additional info in cell when row is hovered in ag-grid

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

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

什么有效? 具有所需行为的列由实现 ICellRendererAngularComponent interface. There I can inject the ElementRef and on the lifecycle hook AfterContentChecked 的自定义单元格渲染器组件渲染 我检查 parents' parent 的 css-class '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 class '.ag-row-悬停在每张支票上。或者有一个带有 css-selector '.ag-row-hover' 的指令存在或不存在。有人知道如何改进我现有的解决方案吗?

您实际上只需使用 CSS 即可实现所需的行为,无需注入 ElementRef 或通过 Angular 生命周期回调执行任何操作。

也就是说,您的自定义渲染器可能看起来像这样:

@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() 中执行的操作。