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

在ng-repeat中使用track by时出现[orderBy:notarray]错误求助

解决AngularJS ng-repeat + track by 出现的 [orderBy:notarray] 错误

这个错误的核心很明确:Angular的orderBy过滤器期望接收一个数组,但实际拿到的是数值0。结合你用到了track by语法,大概率是这几个地方出了问题,我给你一步步拆解排查:

1. 先检查你的数据源是不是数组

最常见的情况是,你在ng-repeat里遍历的变量(比如ng-repeat="item in items"里的items)被错误赋值成了0,而不是数组。

举个错误例子:

// 控制器里的错误代码
angular.module('myApp', [])
.controller('MyCtrl', function($scope) {
  // 不小心把数据源设成了0,而不是数组
  $scope.items = 0;
});

对应的模板:

<div ng-repeat="item in items | orderBy: 'id' track by item.id">...</div>

这时候Angular会把0当成要遍历的对象,传给orderBy后自然报错。

修正方法:
确保你的数据源是数组类型,比如:

angular.module('myApp', [])
.controller('MyCtrl', function($scope) {
  $scope.items = [
    {id: 1, name: 'Alice'},
    {id: 2, name: 'Bob'}
  ];
});

你可以在模板里临时加{{ items }},或者在控制器里用console.log(Array.isArray($scope.items))快速验证。

2. 检查orderBy的参数是否合法

orderBy需要的是排序依据(比如属性名字符串、排序函数、或者排序规则数组),如果你不小心把参数写成了0,也会触发这个错误。

错误示例:

<!-- 错误写法:orderBy的参数是0,不是合法的排序依据 -->
<div ng-repeat="item in items | orderBy: 0 track by item.id">...</div>

修正方法:
把orderBy的参数改成你要排序的属性,比如按name正序:

<div ng-repeat="item in items | orderBy: 'name' track by item.id">
  {{ item.name }}
</div>

如果要倒序,就在属性名前加-:orderBy: '-id'。

3. 确认track by的语法位置

track by必须放在ng-repeat表达式的最后,也就是所有过滤器之后,位置写错也可能导致Angular解析出错。

正确的格式:

ng-repeat="item in 数据源 | 过滤器1 | 过滤器2 track by 跟踪表达式"

比如:

<div ng-repeat="item in items | filter: searchText | orderBy: 'name' track by item.id">...</div>

按照这几步排查,应该能快速定位到问题所在~

内容的提问来源于stack exchange,提问作者Rofhiwa Tumelo Muthivhithi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:46:29