当前位置: 首页 > 知识库问答 >
问题:

在可手持单元中渲染角度组件

艾雪风
2023-03-14

在我的一个项目中,我尝试在表格中显示Angular Components(例如自动完成下拉搜索)。由于我的要求(例如使用ctrl单击多次选择不同的单元格),我决定尝试使用handsontable。

我使用了handsontable渲染器并动态添加组件。

代码看起来像这样

matrix.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;
}

我当前的问题是渲染角度组件的生命周期。

我试过的东西:

  1. 什么都不做

尝试过的解决方案:什么都不做,一切都听天由命

问题:Angular从不调用CellContainer的Ngondestory。

尝试过的解决方案:将组件Ref保存在数组中,并在一定数量的渲染后尝试销毁我前一段时间渲染的组件。通过时间计数,渲染方法中的手动挂钩(垂直滚动/beforeRender/postRender)

问题:角度组件的销毁总是会引发错误(“无法读取null的属性‘nativeNode’”),或者组件显示完全错误

尝试的解决方案:在渲染期间:我检查是否已经有组件,以及是否仅通过添加新值来回收已经存在的组件。

问题:这些值在滚动过程中完全混淆。

github上提供了指向我的解决方案(以及已实施的解决方案#3)的链接。

有人知道如何以干净的方式处理这个问题吗?如果没有,应用程序就会变慢

共有2个答案

微生嘉祥
2023-03-14

可能您需要尝试更改检测,如下所示,强制对您的组件进行新更改。

changeDetection: ChangeDetectionStrategy.OnPush
江天宇
2023-03-14

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

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

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

});
 类似资料:
  • 只是一个简单的问题。 让我们将这段代码作为IE: 是 NgIf 内的内容呈现然后从页面中隐藏,还是角度“知道”此 div 不会显示,因此甚至不渲染其中的内容?

  • 问题内容: 如果我正在渲染而不是,则以下代码有效。 是否可以将玉器文件渲染为部分角度? 问题答案: 是的,有可能。看下面的链接 需要注意的两个重要点是: 代替和 在路由中添加以下内容:(代码用于node中的expressjs) 退出并重新启动节点/快速服务器。

  • 问题内容: 我正在跟踪发现的一些代码,(是的,我知道它是如何工作的)它来自这里:代码链接 我想做的是如果单元格值设置为“黄色”,则设置单元格前景色 这是我的代码: 和单元格渲染器 问题是,如果我将任何单元格值设置为“黄色”,它就不会改变 提前致谢! 问题答案: 您的渲染器曾经使用过吗?您将其设置为包含String的单元格的默认渲染器,但是是否重载了模型的方法,以便它知道某些单元格包含String

  • 我正在生成一个PdfPTable并将其添加到章节中,然后将章节添加到我的文档中。我的表格有几个单元格,其中行跨度 但是打印时,第2行和第3行之间有一个分页符,我希望表格如下所示: 这要归功于我在这里学到的一个技巧,我有一个实现IPdfPCellEvent的类,我实例化并附加到具有RowSpan的单元格 如果多次调用CellLayout(),则会发生后续调用,因为行跨度已溢出到新页面上(与我上面描述

  • 我正在尝试将准备渲染器组件与自定义单元格渲染器一起使用。这个想法是使用准备渲染器绘制整行,并使用客户单元格渲染器绘制基于单元格值的自定义。 prepareRenderer 通过突出显示整行来按预期工作,但自定义单元格呈现器突出显示的单元格不会显示颜色,除非选定该属性。自定义单元格呈现似乎仅在单元格选择时起作用(突出显示包含 1 的单元格,但仅在选择时)。 关于如何使两者齐头并进,有什么想法吗? 下

  • 我们当前的任务要求我们在openGL中使用较旧的固定管道方法。我们使用的是LWJGL 2.9.3。下面的代码显示一个三角形。问题是,它会疯狂地闪烁。显示器。swapBuffers()方法不会引发异常,并且无论是否包含它都没有任何区别。我根据这个问题创建了这个示例: gluPerspective、GluViewport、gluLookAt以及GL_投影和GL_MODELVIEW矩阵 编辑 还有一件事