为什么array.push在Angular4和Priming中不适用于保存表数据的集合?

为什么array.push在Angular4和Priming中不适用于保存表数据的集合?,angular,primeng,primeng-datatable,Angular,Primeng,Primeng Datatable,因此,有以下标记: <p-dataTable selectionMode="single" [(selection)]="selectedUsers" dataKey="id" [value]="users

因此,有以下标记:

<p-dataTable
                                    selectionMode="single"
                                    [(selection)]="selectedUsers"
                                    dataKey="id"
                                    [value]="users"
                                    [rows]="25" [paginator]="users.length>25" [pageLinks]="3"
                                    [rowsPerPageOptions]="[10,25,50,100]"
                                   >

我的问题是,为什么注释行不起作用?记录在表中不可见,尽管
console.log(this.users)
显示每次推送后集合不断增加PrimeNG的数据表查找引用中的更改,因此它需要不可变的数据。 如果您不需要利用不变性带来的好处,只需将
p-dataTable的
[immutable]
属性设置为false。但请记住,它将强制datatable在每个ngDoCheck生命周期中检查绑定到
[value]
属性的集合,从而导致性能下降

您可以在源代码的视图中很好地看到它没有改变的原因

 set value(val:any[]) { // this will be triggered only by reassigning to this.users
        if(this.immutable) {
            this._value = val ? [...val] : null;  
            this.handleDataChange();
        }
        else {
            this._value = val;
        }

        this.valueChange.emit(this.value);
    }
现在,如果您从未重新分配并将
[immutable]
设置为false,它将检查生命周期中的差异

    ngDoCheck() {
    if(!this.immutable) {
        let changes = this.differ.diff(this.value);
        if(changes) {
            this.handleDataChange();
        }
    }
}

我希望我能帮忙。祝你度过愉快的一天,不要做出反应:)

好吧,可以“强制”更新吗?我觉得更方便的做法是推送一行并触发更新,然后处理数组连接和替换。不幸的是,我想不出任何好的方法。您可以从使用datatable的组件中分离更改检测器(但这会产生很多后果),将immutable设置为false,然后运行this.changeDetectorRef.detectChanges(),这样它将仅在您需要时才在datatable中运行doCheck,这样不会使事情变得更简单(我猜:)。Mabe将immutable设置为false是一种方法,毕竟表中不会有太多数据。谢谢或者可以使用
VisualChild
获取对数据表组件实例的引用,并在推行时运行
handleDataChange()
方法。它是公开的,所以我们现在讨论的时候不需要任何javascript原型的把戏。让我检查一下它是否有效
    ngDoCheck() {
    if(!this.immutable) {
        let changes = this.differ.diff(this.value);
        if(changes) {
            this.handleDataChange();
        }
    }
}