无法访问角度光滑网格的服务回调订阅



我们目前正在将angular slickgrid从2.30.4版本升级到3.3.2版本。

在迁移到版本3的过程中,我们无法从angularGridInstance访问onPaginationChanged和其他回调,如下所述。

this.angularGrid.paginationService.onPaginationChanged.subscribe(e => {
this.writeConsole('Info', this.constructor.name, 'onPaginationChanged', type, '-', e);
this.changeSelectionHeader(assignmentObject['internalProcess']['angularGrid'].slickGrid, assignmentObject['internalProcess']['angularGrid'].dataView);
})

我们已经研究了您的文档,并分析了我们可以从<angular-slickgrid>标记获得此回调,但是,我们是否有机会通过上面格式中提到的typescript本身访问它们。

角度Slickgrid>3.x事件实际上都是JS自定义事件,因此您可以使用任何JavaScript方式来侦听事件更改,这将起作用。你有很多方法来处理你试图做的

1.默认和记录方式-模板事件

模板自定义事件-Wiki

<angular-slickgrid gridId="grid1"
[columnDefinitions]="columnDefinitions"
[gridOptions]="gridOptions"
[dataset]="dataset"
(onPaginationChanged)="onPaginationChanged($event.detail)">
</angular-slickgrid>
2.使用网格状态

记录在电网状态&预设-Wiki,让你可以访问多种内容,如过滤器,排序,分页,锁定

<angular-slickgrid gridId="grid1"
[columnDefinitions]="columnDefinitions"
[gridOptions]="gridOptions"
[dataset]="dataset"
(onGridStateChanged)="gridStateChanged($event.detail)">
</angular-slickgrid>
gridStateChanged(gridStateChanges: GridStateChange) {
console.log('Grid State changed:: ', gridStateChanges);
}
3.在自定义事件上使用JSaddEventListener
ngAfterViewInit() { 
document.querySelector('[gridid="grid1"]')?.addEventListener('onPaginationChanged', (data: any) => {
console.log('event listener pagination changed', data)
})
}
4.使用组件ref访问Angular Slickgrid私有服务

根本不推荐,这是作弊行为,将来可能会崩溃

事实上,考虑到EventPubSubService是一个private属性(谁知道这在未来可能会中断(,我很惊讶它能起作用,但添加组件ref似乎可以让我们访问Angular Slickgrid网格的整个实例,甚至是private服务变量。

从技术上讲,Angular/TypeScript不应该允许这一事件,但从今天起,你可能会作弊。

<angular-slickgrid gridId="grid1" #myGridRef
[columnDefinitions]="columnDefinitions"
[gridOptions]="gridOptions"
[dataset]="dataset">
</angular-slickgrid>
ngAfterViewInit() {
this.myGridRef._eventPubSubService.subscribe('onPaginationChanged', (data:any)=> console.log('pagination changed', data))
console.log('eventPubSub',  this.myGridRef._eventPubSubService)
}
5.将EventPubSubService暴露给AngularGridInstance

这个服务似乎还没有公开给AngularGridInstance,我可能会在未来的版本中添加它,但我最近(本周(发布了Angular Slickgrid的v5.0.0版本,我从来没有使用过旧版本,所以对于这个用例,你必须升级才能访问这个案例的

需要一个新的Angular Slickgrid功能(现在可与v5.1.0一起使用(,可能在未来

angularGridReady(angularGrid: AngularGridInstance) {
this.angularGrid = angularGrid;

this.angularGrid.eventPubSubService.subscribe('onPaginationChanged', (data:any)=> console.log('pagination changed', data))
}

最后注释

显然,在99%的情况下,最好的选择是选项1和/或选项2(这就是为什么它被记录在案(,而其他选项确实有效,它们显然不是理想的解决方案,也因此没有记录在案,最后一个选项5似乎也是有效的,可能在不久的将来到达(现在可用(,但只在Angular Slickgrid>=5.x中,因为我是一个单独的开发人员,这个项目是开源的,我没有得到支持的报酬,所以我只提供最新版本的支持,截至今天,它是v5.0.0和更高版本的

最后一点,我总是在每个版本之间提供迁移指南,按照正确的顺序遵循它们是很重要的(在迁移到3.x的情况下,大多数与迁移相关的答案已经在这些指南中得到了回答。

最新更新