带有 *ngIf 的 Angular 数据表显示错误

Posted

技术标签:

【中文标题】带有 *ngIf 的 Angular 数据表显示错误【英文标题】:Angular Datatables with *ngIf shows error 【发布时间】:2020-11-06 20:48:34 【问题描述】:

我正在使用Angular Datatables 来显示一些表格数据。我在表中添加了*ngIf 条件,这样在数据完全加载之前它是不可见的。表格代码如下所示:

<table class="table" id="releaseDatatable" datatable [dtOptions]="dtOptions" [dtTrigger]="dtTrigger" *ngIf="!loading">

loading 变量我从我的组件中设置,然后调用this.dtTrigger.next()。我有以下代码来设置loading

set loading(loading: boolean) 
        this._loading = loading;
       setTimeout(()=>
            this.dtTrigger.next();
       , 100);
    

现在是第一次,一切正常。但是当我尝试重新加载表(在编辑或删除之后)时,它显示以下错误:

ERROR ObjectUnsubscribedErrorImpl message: "object unsubscribed", name: "ObjectUnsubscribedError" 

并且this.dtTriggernull 作为观察者。如何解决这个问题?我尝试重新渲染表格,但它也无法正常工作。

【问题讨论】:

【参考方案1】:

您可以使用[ngClass] 并隐藏而不是使用ngIf

<table class="table" id="releaseDatatable" datatable [dtOptions]="dtOptions" [dtTrigger]="dtTrigger" [ngClass]="loading">

在组件中将加载属性设置为“隐藏”或“显示”;

在css中隐藏它

.hide
   display:none;

为了再次渲染,我使用销毁并触发下一个

导入

  import  DataTableDirective  from 'angular-datatables';

  @ViewChild(DataTableDirective, static: false)  
   datatableElement: DataTableDirective;

渲染

rerender()
        this.datatableElement.dtInstance.then((dtInstance: DataTables.Api) => 
            dtInstance.destroy();
            this.dtTrigger.next();
        );       
    

调用这个重新渲染方法

set loading(loading: boolean) 
       setTimeout(()=>
            this.rerender();
       , 100);
    

【讨论】:

this 上下文已经被箭头函数捕获,不需要self 变量 我认为问题在于ngIf 从 DOM 中删除了表格,因此第二次无法触发表格重新加载。但不知道如何解决它。 @HappyCoder 是的,你是对的。您可以使用 class 而不是 ngIf 作为一种方式。我用这种方法更新答案 那也行不通。它显示DataTables warning: table id=releaseDatatable - Cannot reinitialise DataTable. For more information about this error, please see http://datatables.net/tn/3 这是重新渲染问题。我更新了重新渲染表的答案。我首先销毁然后触发下一个@HappyCoder【参考方案2】:

这是 Angular Datatables 如何重新渲染的一个已知问题

您可以从 GitHub 问题列表中找到更多详细信息和解决方法,例如https://github.com/l-lin/angular-datatables/issues/1241

一些 cmets 建议使用 [hidden] 而不是 *ngIf

【讨论】:

任何解决方法?我尝试使用那里提到的hidden,但它显示错误DataTables warning: table id=releaseDatatable - Cannot reinitialise DataTable. For more information about this error, please see http://datatables.net/tn/3 您是否关注了警告消息提供的文档链接? 是的。但不知道如何解决这个问题。 该组件库在后台使用 jQuery,这也是存在如此多未解决问题和渲染问题的部分原因(它没有以推荐的方式遵循 Angular 组件生命周期)。您是否考虑过 ag-grid 作为替代方案 - 如果您还没有大量投资于这个是【参考方案3】:

最好为您的表格添加一个包装器 div,例如 &lt;div *ngIf="!loading"&gt;&lt;table&gt;&lt;/table&gt;&lt;/div&gt;

Angular v2 不支持在同一个元素上使用多个结构指令。

【讨论】:

以上是关于带有 *ngIf 的 Angular 数据表显示错误的主要内容,如果未能解决你的问题,请参考以下文章

angular入门篇(2)——*ngIf,数据绑定事件,属性绑定

Angular:使用 NgIf 删除组件、内部表单和元素?

Angular2:条件显示,绑定到 [hidden] 属性与 *ngIf 指令 [重复]

Angular 6 中 ngIf 中的多个条件

组件与模板 显示数据

使用ngIf更改Angular 8中的图像时的问题编写语法