在代理调用导致ExpressionChangedAfterItHasBeenCheckedError后,在代码中设置MatSort的排序

时间:2019-02-21 14:49:14

标签: angular typescript sorting

我想在重新加载数据后保留表的排序设置。我尝试通过在调用代理后触发代码中的排序来做到这一点:

$crap = Get-Content C:\temp\input.csv | Select-Object -First 5
$OnlyVulns = Get-Content C:\temp\input.csv | Select-Object -Skip 5 | ConvertFrom-Csv | Where-Object Type -eq 'Vuln'

$CrapAndOnlyVulns = $crap + $OnlyVulns
$CrapAndOnlyVulns > C:\pathTo\NewFile.csv

我的html表是这样的

this.keptSort = 'name',
this.keptSortDirection = 'desc',
this.someProxy
    .getTableContent(this.id)            
        .subscribe((res) => {
            const rows = res.map((r) => new RowMode(r)); 
            this.dataSource = new MatTableDataSource(rows);
            this.selectRowsWithId(this.selection);
            if (this.sort) {
                this.sort.sort(<MatSortable>{ 
                   id: this.keptSort, 
                   start: this.keptSortDirection});
            }
});

但这会导致错误:

  

错误:ExpressionChangedAfterItHasBeenCheckedError:检查表达式后,表达式已更改。先前的值:“活动:未定义”。当前值:“ active:false”。似乎已在对其父级和子级进行脏检查后创建了该视图。

其他信息,我也有MatSort设置器:

<table
    mat-table                    
    matSort
    [dataSource]="dataSource"
    matSortActive="creationDate"
    matSortDirection="desc" >
...</table>

@ViewChild(MatSort) set matSort(ms: MatSort) {
    if (ms) {
        this.sort = ms;
        this.setDataSourceAttributes();
    }
}

关于如何解决此问题的任何想法或方向指示?

1 个答案:

答案 0 :(得分:1)

找到了解决方法! :D

对于那些感兴趣的人:

我从代理的订阅中删除了“ if(this.sort){...}”部分。

然后我更改了表格html,现在使用函数来定义排序:

<table
    mat-table                    
    matSort
    [dataSource]="dataSource"
    [matSortActive]="getActiveSort()"
    [matSortDirection]="getSortDirection()" >
...</table>

这些函数将返回所需的排序设置。