控制器
@RequestMapping(value = "/graphs", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public Collection<Graph> getSkeletonGraph()
{
log.debug("REST request to get current graphs");
return graphService.getSkeletonGraphs();
}
Angular call
$scope.graphs = [];
Graph.getGraphs().$promise.then(function(result)
{
$scope.graphs = result;
});
angular.module('sampleApplicationApp').factory('Graph', function($resource)
{
return {
getGraphs: function() {
return $resource('api/graphs/:id').query();
}
};
})
我不确定为什么使用过滤器我会得到例外。
还查看了角度文档https://docs.angularjs.org/error/filter/notarray 我的结果是数组,但不确定为什么我会得到这样的例外。
来自后端的示例结果。
[{"id":"135520b0-9e4b-11e5-a67e-5668957d0149","area":"Bingo","models":[],"enumerateds":[]},{"id":"0db925e0-9e53-11e5-a67e-5668957d0149","area":"jin","models":[],"enumerateds":[]},{"id":"7a717330-9788-11e5-b259-5668957d0149","area":"Product","models":[],"enumerateds":[]},{"id":"402d4c30-980f-11e5-a2a3-5668957d0149","area":"fgfgfg","models":[],"enumerateds":[]},{"id":"404b77b0-9e53-11e5-a67e-5668957d0149","area":"olah","models":[],"enumerateds":[]},{"id":"cd071b10-9e52-11e5-a67e-5668957d0149","area":"lolo","models":[],"enumerateds":[]},{"id":"d9808e60-9710-11e5-b112-5668957d0149","area":"catalog","models":[],"enumerateds":[]},{"id":"2aaca9f0-97e2-11e5-91cd-5668957d0149","area":"btg","models":[],"enumerateds":[]},{"id":"955e9ed0-978c-11e5-93fd-5668957d0149","area":"promotions","models":[],"enumerateds":[]},{"id":"1e441d60-980f-11e5-a2a3-5668957d0149","area":"hjuhh","models":[],"enumerateds":[]},{"id":"fb96dfe0-978d-11e5-93fd-5668957d0149","area":"voucher","models":[],"enumerateds":[]}]
HTML
<li ng-repeat="g in graphs track by $index | filter:searchText"></li>
答案 0 :(得分:64)
问题出现是因为您在应用过滤器之前使用track by $index
。要解决此问题,请将表达式更改为:
<li ng-repeat="g in graphs | filter:searchText track by $index"></li>
track by
表达式应始终位于所有过滤器之后的最后一个表达式。它是文档中提到的规则:ngRepeat
说明:
如果您未在track by $index
中使用ngRepeat
,则所使用的所有过滤器的输入都是数组,即,如果
ng-repeat="item in items | filter1 | filter2",
然后items
是默认传递给过滤器的输入,并且对此输入进行过滤。
但是,当您使用track by $index
时,过滤器的输入会变为$index
而不是items
,因此会出现错误:
预期数组(读取:项目)但收到0(读取:$ index)。
因此,为了解决这个问题,数组首先通过所有过滤器,过滤后的结果与track by $index
一起使用。
希望这可以解决它。
答案 1 :(得分:3)
您应该始终在表达式结尾处使用track by
<li ng-repeat="g in graphs | filter:searchText track by $index"></li>
因为在评估ng-repeat
angular的表达式时需要跟踪的最终结果才能工作。如果您在最后提供,则将应用您的过滤器,并在最终输出上计算track by
。您可以在angular docs上看到源代码。
根据ng-repeat
如果您正在使用具有标识符属性的对象,那么 应该通过标识符而不是整个对象进行跟踪。你应该 稍后重新加载数据,ngRepeat将不必重建DOM 它已经渲染的项目的元素,即使是JavaScript 集合中的对象已替换为新对象。对于 大型系列,这显着提高了渲染性能。 如果您没有唯一标识符,也可以按$ index跟踪 提高性能。