我一直在试图将ngx-perfect-scrollbar应用于ag-grid。我可以单独工作,但我想用完美滚动条完全替换数据表上的默认滚动条。
我按照their instructions设置了我的模块:
import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
import { PerfectScrollbarConfigInterface } from 'ngx-perfect-scrollbar';
const PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
suppressScrollX: true
};
@NgModule({
declarations: [
],
imports: [
PerfectScrollbarModule.forRoot(PERFECT_SCROLLBAR_CONFIG)
]
})
并在我的模板中:
<perfect-scrollbar class="psc">
<ag-grid-angular #agGrid style="width:100%;height:100%" class="ag-dark"
[gridOptions]="gridOptions"
[rowData]="rowData">
</ag-grid-angular>
</perfect-scrollbar>
这只会导致外部元素出现在新的自定义滚动条中,其中包含带有标准工具栏的数据网格。我需要将两个指令同时应用于同一个元素,但我对如何执行此操作感到很遗憾。
我还尝试this approach,使用标准(非角度)完美滚动条包,并尝试在加载组件时将其绑定到正确的.ag-body-viewport
元素:
import perfectScrollbar from 'perfectScrollbar';
this.viewport = this.$element.find('.ag-body-viewport')[0];
perfectScrollbar.initialize(this.viewport);
但我也无法让它工作;我刚刚收到“无默认导出”错误...
任何指针都表示赞赏。感谢
答案 0 :(得分:0)
尝试导入完美的滚动条,如下所示:
import * as perfectScrollbar from 'perfect-scrollbar';
然后你可以使用perfectScrollbar.initialize()和perfectScrollbar.update();
答案 1 :(得分:0)
我在ag-grid-angular中实现了它:
我正在保持ag-grid-angular的组件的ngAfterViewInit生命挂钩中运行它。但可能也可能是onAgGridReady事件 。我在ngAfterViewInit中调用的方法如下:
private runPerfectScrollbar() {
const agBodyViewport = window.document.getElementsByClassName('ag-body-viewport')[0];
this.perfectScrollbar = new PerfectScrollbar(agBodyViewport);
this.perfectScrollbar.update();
}
那么您需要关心一些情况。例如,当调整列大小时,我在ag-grid的(dragStarted)事件上运行this.perfectScrollbar.destroy()
。当(dragStopped)时,我再次调用此runPerfectScrollbar()。
如果您发现性能问题,例如在firefox集suppressColumnVirtualisation: window.navigator.userAgent.toLowerCase().indexOf('firefox') > -1 ? true : false.
上(当然,可以用某种方法写得更好;))
但是令我惊讶的是,它解决了其他一些问题。例如,我在滚动浏览器上没有太多滞后于Firefox。在野生动物园中,我对过度滚动没有橡皮筋效果。
我不确定ag网格中的所有设置。我在页面上有分页。因此,我只能显示有限的行。但是,如果您有任何问题,我会尽力提供帮助。
答案 2 :(得分:0)
将 ag-grid-angular 中的完美滚动条添加到Angular 7应用程序(水平+垂直)的步骤。
import PerfectScrollbar from 'perfect-scrollbar';
perfect-scrollbar.css
.ag-body-viewport, .ag-body-horizontal-scroll-viewport{
position: relative;
overflow: hidden !important;
}
<div class="table-responsive" #gridContainer>
<ag-grid-angular (gridReady)="onGridReady($event,gridContainer)">
</ag-grid-angular>
</div>
在Component中,按如下所示添加此方法以初始化滚动
onGridReady(params: any,gridContainer) {
let array=[ ".ag-body-viewport"," .ag-body-horizontal-scroll-viewport"]
array.forEach(element => {
let container = <HTMLElement> gridContainer.querySelector(element)
if(container){
const ps = new PerfectScrollbar(container);
ps.update();
}
});
}
答案 3 :(得分:0)
我想出了另一种方法来实现这一目标:
在相应模块中导入PerfectScrollbarModule
@NgModule({
imports: [
PerfectScrollbarModule,
],
})
export class AppModule {}
/* Hides the scrollbars in the ag-grid table */
.ag-theme-bootstrap .ag-body-viewport,
.ag-theme-bootstrap .ag-body-viewport .ag-body-horizontal-scroll-viewport,
.ag-theme-bootstrap .ag-body-viewport .ag-body-vertical-scroll-viewport {
position: relative;
overflow: hidden !important;
}
为简单起见,我只是添加了ag-grid的绑定以使此功能正常工作。
这里的关键是:
目标是能够调用PerfectScrollbarDirective的update方法,以便在调整列大小后设置新宽度后在UI上反映更改:
<div class="table-container ps" [perfectScrollbar]="config">
<ag-grid-angular
style="width: 100%"
[style.width.px]="width"
[suppressHorizontalScroll]="true"
(columnResized)="onColumnResized()"
>
</ag-grid-angular>
</div>
ngx-perfect-scrollbar始终需要这样做:
.table-container {
position: relative;
max-height: your height here;
}
export class TableComponent {
public width: number = null; // This must be null otherwise it does not work properly after calling the sizeColumnsToFit function
@ViewChild(PerfectScrollbarDirective, { static: false })
public directiveRef?: PerfectScrollbarDirective;
public config: PerfectScrollbarConfigInterface = {};
public constructor(private store: Store<AppState>, private elementRef: ElementRef) {}
public onColumnResized(): void {
this.updateTableWidth();
}
private updateTableWidth(): void {
const agBodyViewport: HTMLElement = this.elementRef.nativeElement.querySelector(".ag-body-viewport");
if (agBodyViewport) {
if (agBodyViewport) {
this.width = agBodyViewport.scrollWidth > agBodyViewport.offsetWidth ? agBodyViewport.scrollWidth : null;
this.directiveRef.update();
}
}
}
}