为什么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();
}
}
}