Input mat table数据源的角度输入变化检测性能

Input mat table数据源的角度输入变化检测性能,input,datasource,angular5,ngonchanges,angular-material-5,Input,Datasource,Angular5,Ngonchanges,Angular Material 5,有人知道在ngOnChanges生命周期挂钩中更新mat表数据源是否正常吗?或者是否存在潜在的大规模数据泄漏或性能问题 这里有一个简单的例子来说明我的意思 子组件有一个输入数据的父组件,如下所示: <data-list [data]="someData"></data-list> 以及子组件: import { Component, Input, SimpleChanges, OnInit, OnChanges } from '@angular/core'; imp

有人知道在ngOnChanges生命周期挂钩中更新mat表数据源是否正常吗?或者是否存在潜在的大规模数据泄漏或性能问题

这里有一个简单的例子来说明我的意思

子组件有一个输入数据的父组件,如下所示:

<data-list [data]="someData"></data-list>

以及子组件:

import { Component, Input, SimpleChanges, OnInit, OnChanges } from '@angular/core';
import { MatTableDataSource } from '@angular/material';


@Component({
  selector: 'data-list',
  templateUrl: './data-list.component.html',
  styleUrls: ['./data-list.component.scss']
})
export class DataListComponent implements OnInit, OnChanges {
  @Input() data: any[];

  dataSource: MatTableDataSource<any>;
  displayedColumns = [
    'title',
    'detail'
  ];

  constructor() { }

  ngOnInit() {
    this.dataSource = new MatTableDataSource<any>(this.data);
  }

  ngOnChanges(changes: SimpleChanges) {
    this.dataSource = new MatTableDataSource<any>(changes.data.currentValue);
  }

}
从'@angular/core'导入{Component,Input,SimpleChanges,OnInit,OnChanges};
从“@angular/material”导入{MatTableDataSource};
@组成部分({
选择器:'数据列表',
templateUrl:'./data list.component.html',
样式URL:['./数据列表.component.scss']
})
导出类DataListComponent实现OnInit、OnChanges{
@输入()数据:任意[];
数据源:MatTableDataSource;
displayedColumns=[
“头衔”,
“细节”
];
构造函数(){}
恩戈尼尼特(){
this.dataSource=新MatTableDataSource(this.data);
}
ngOnChanges(更改:SimpleChanges){
this.dataSource=新MatTableDataSource(changes.data.currentValue);
}
}
现在,父组件订阅了对数据的不同更改作出反应的不同观察值。也就是说,如果添加或删除了数据,则会相应地更新父组件,并将其作为输入传递给子组件

由于子组件使用ngOnChanges lifecycle钩子监视输入数据中的更改,因此子组件通过实例化新的MatTableDataSource来更新表数据

一切都很顺利。除了ngOnChanges经常触发之外,我很小心每次都要实例化一个新的表源——比如,它让我感到紧张

我知道这个子组件可以订阅更改并负责数据,而不是从父组件接收数据,但如果可以,我宁愿保持“智能”和“哑”组件关系


是否有人以这种方式进行大规模生产?这样行吗?我只是因为在过去的24小时里盯着电脑屏幕看了大半个小时而变得神经质吗?

事实上,我今天花了几个小时研究这个问题,到目前为止,我发现最好的选择是通过父组件将数据源绑定到子组件,因为对父组件的更新立即呈现,而当数据传递到子组件时,下游的更新在视觉上是明显的。@WillRu“通过父组件将数据源绑定到子组件”到底是什么意思?你是说你在父对象中新建MatTableDataSource并将其作为输入传递给子对象吗?另外,我发现我的应用程序遇到的一个性能瓶颈与角度变化检测直接相关。对于我的一些较慢的组件,将更改检测策略从“CheckAlways(default)”更改为“OnPush”有很大帮助。这确实需要在每个组件的基础上加以注意——我发现这很有用。这篇文章很棒。我正在传递数据源,但在遇到下游分页的进一步问题后,最终改变了方法,现在使用服务通过
this.datasource.data=…
只更新数据源中的数据,而不是每次更新都创建一个新表。这似乎有助于解决一些性能问题。嗨@WillRu我也遇到了类似的问题,你能举个例子吗。你是怎么做到的。