在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
相关产品推荐
相关产品推荐

