Material 2 md-table按DateCreated字段排序功能异常求助
解决Material Table按DateCreated字段排序失效的问题
我看了你的代码片段,发现几个关键问题导致排序功能无法正常工作,咱们一步步来修复:
1. 移除Angular原生orderBy与Material Table排序的冲突
你在<tr md-row>的ng-repeat里用了Angular原生的orderBy:'item.DateCreated':true过滤器,但Angular Material的md-table有自己的内置排序机制(通过md-order-by和md-order指令),两者同时使用会互相干扰,导致排序逻辑混乱。必须移除ng-repeat中的orderBy过滤器,让Material Table独自处理排序逻辑。
2. 修正表头排序指令的语法错误
你的<thead>标签里md-order='item.DateCreated'"多了一个多余的闭合双引号,而且md-order-by的写法也有误——不需要加item.前缀,它是直接对应数据源的字段名。同时建议在控制器里定义一个变量来维护排序状态,这样更便于控制。
修正后的表头代码:
<table md-table md-progress="promise" style="margin-top: -12px"> <thead md-head md-order="vm.sortOrder"> <tr md-row> <th md-column style="min-width: 138px;" md-order-by="DateCreated">Date</th> <th md-column ng-show="vm.showComments !== vm.POSNotes && vm.showComments !== vm.TelemarketingNotes">Code</th> <th md-column ng-show="vm.showComments !== vm.POSNotes && vm.showComments !== vm.TelemarketingNotes">Description</th> <th md-column>Note</th> <th md-column style="min-width: 100px;"></th> </tr> </thead>
3. 调整tbody部分的数据源绑定
移除ng-repeat里的orderBy过滤器,让Material Table直接绑定数据源:
<tbody md-body> <tr md-row ng-repeat="item in vm.showComments"> <td md-cell ng-if="item.MemoCode==='MSS'|| item.MemoCode==='ADMIN' || item.MemoCode==='MEMBERSVC' || item.MemoCode==='BILLING'"> {{ item.DateCreated | date: 'mediumDate' }} </td> <td md-cell ng-if="!(item.MemoCode==='MSS'|| item.MemoCode==='ADMIN' || item.MemoCode==='MEMBERSVC' || item.MemoCode==='BILLING')"> {{ item.noteDateCreated | date: 'mediumDate' }} </td> <!-- 其他单元格代码保持不变 --> </tr> </tbody> </table>
4. 控制器中初始化排序状态
在你的控制器里添加排序相关的变量,用来控制默认排序字段和方向:
// 初始化排序配置 vm.sortOrder = 'DateCreated'; // 默认按DateCreated字段排序 vm.sortReverse = false; // 默认升序,需要降序则设为true
额外注意:确保日期字段是Date对象
如果你的DateCreated或noteDateCreated是字符串格式,Material Table会按字符串字典序排序,而不是时间顺序。需要在获取数据后把字符串转为Date对象:
// 预处理数据源,转换日期格式 vm.showComments.forEach(item => { item.DateCreated = new Date(item.DateCreated); if (item.noteDateCreated) { item.noteDateCreated = new Date(item.noteDateCreated); } });
做完以上调整后,点击Date列的表头就能正常触发排序功能了,排序逻辑会统一由Material Table组件处理,避免了指令冲突的问题。
内容的提问来源于stack exchange,提问作者Sohail
相关产品推荐
相关产品推荐

