我想要实现的是根据用户的选择对数组用户进行排序,并将结果拆分为20的可导航页面.
我的模板有一个看起来像这样的表
<table>
<thead>...</thead>
<tbody>
<tr
*ngFor="let theUser of users | sort: [ sortField, sortAscending ] | paginate: [ pageNumber-1, pageSize ] ">
<td>{{theUser.id}}</td>
<td>{{theUser.attribute0}}</td>
<td>{{theUser.attribute1}}</td>
<td>{{theUser.attribute2}}</td>
</tr>
</tbody>
</table>
paginate输出输入表的一部分,根据给定的参数对其进行排序.两个管道都是由我编写的,并按预期单独工作.
该组件更改了绑定到表头单元格上的单击的函数中的变量sortField和sortAscending,这些单元格根据单击的单元格调用此函数:
sortUsers(field:string): void{
if(this.sortField==field){
this.sortAscending=!this.sortAscending;
}else{
this.sortAscending=true;
this.sortField=field;
}
this.detector.detectChanges();
}
其中detector是一个注入的ChangeDetectorRef实例.
此外,pageNumber与[(ngModel)]绑定到微调器.
我的问题是,当我单击表头单元格时,我的管道日志输出表明只调用了第一个管道,当我更改微调器的值时,只调用第二个管道.我期待的行为是两个管道都被调用.
编辑:我通过递增pageNumber,调用detectChanges然后递减它并再次调用detectChanges来解决这个特殊情况.我还是想知道如何解决一般情况.
EDIT2:Plunker here,相关bug report here
最佳答案 正如错误报告中指出的那样,问题是我的排序正在输出对原始数组的引用.由于引用没有改变,因此更改检测将输出解释为未更改.
GitHub的用户vicb提供了以下解决方案:
>返回一个新数组.
>这是针对此特定用例的正确解决方案. sort的输出每次应该是一个明显不同的数组,因此每次更改数组ref都是有意义的,并将更改传达给Angular2变化检测.
>将管道标记为非纯净.
>这将导致每个变化检测轮次运行分页,即每次击键或鼠标移动.可能是可以接受的,但需要比上述更多的处理器周期.
>在sort / paginate上手动触发更改检测.