You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:17