gpt4 book ai didi

angular - 在 Handsontable Cells 中渲染 Angular 组件

转载 作者:行者123 更新时间:2023-12-04 04:25:03 24 4
gpt4 key购买 nike

在我的一个项目中,我尝试在表格中显示 Angular 组件(如自动完成下拉搜索)。由于我的要求(例如使用 ctrl+click 多选不同的单元格),我决定尝试使用 handsontable。
我用过 handsontable rendereradd the components dynamically .
代码看起来像这样
矩阵.component.ts

this.hot = new Handsontable(this.handsontable.nativeElement, {
data: this.tableData,
colWidths: [80, 300],
colHeaders: ['Id', 'Custom Component'],
columns: [
{
data: 'id',
},
{
data: 'id',
renderer: (instance: any, td: any, row: any, col: any, prop: any, value: any, cellProperties: any) => {
if (cellProperties.hasOwnProperty('ref')) {
(cellProperties.ref as ComponentRef<CellContainerComponent>).instance.value = row;
} else {
cellProperties.ref = this.loadComponentAtDom(
CellContainerComponent,
td,
((component: any) => {
component.template = this.button4Matrix;
component.value = row;
}));
}
return td;
},
readOnly: true,
},
],
});


private loadComponentAtDom<T>(component: Type<T>, dom: Element, onInit?: (component: T) => void): ComponentRef<T> {
let componentRef;
try {
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);
componentRef = componentFactory.create(this.injector, [], dom);
onInit ? onInit(componentRef.instance) : console.log('no init');
this.appRef.attachView(componentRef.hostView);
} catch (e) {
console.error('Unable to load component', component, 'at', dom);
throw e;
}
return componentRef;
}
我当前的问题是呈现的 Angular 组件的生命周期。
我试过的东西:
  • 什么都不做

  • 尝试过的解决方案:什么都不做,把一切都留给 Angular
    问题:Angular 从不调用 CellContainer 的 ngOnDestroy。
  • 保存组件引用

  • 尝试过的解决方案:将 componentRef 保存在一个数组中,并在经过一定量的渲染后尝试销毁我的组件
    前段时间渲染。通过时间计数,handsontable hooks
    (verticalScroll/beforeRender/afterRender),在渲染方法中
    问题: Angular 组件的销毁总是抛出错误('cannot read property'nativeNode' of null')或组件获取
    显示完全错误
  • 在渲染过程中检查元素是否存在

  • 尝试过的解决方案:在渲染过程中:我检查了是否已经有一个组件,以及我是否曾经通过仅添加一个新值来回收已经存在的组件。
    问题:滚动期间值完全混淆。
    github 上提供了指向我的解决方案(以及已实现的解决方案 #3)的链接。 .
    有没有人知道如何以干净的方式处理这个问题?如果不是,在稍微滚动和使用表格后,应用程序变得缓慢且无法使用。
    最好引用: https://handsontable.com/docs/8.2.0/tutorial-cell-function.html

    最佳答案

    使用单元格渲染器。
    配置列时使用您选择的渲染器名称:

    const container = document.getElementById('container');

    const hot = new Handsontable(container,
    {
    data: someData,
    columns:
    [{
    renderer: 'numeric'
    }]

    });

    关于angular - 在 Handsontable Cells 中渲染 Angular 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49295984/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com