我有一个我用ng-repeat
显示的项目列表。我想添加一个过滤器来显示/隐藏已归档的项目。
我添加了一个复选框:
<input type="checkbox" ng-model="queryFilter.archived">Show archived messages
在我的控制器中我有这个:
$scope.queryFilter = {
archived: false
};
我的项目列表显示在表格中。我尝试了以下内容:
<tr ng-repeat="message in messages | filter : queryFilter">
<tr ng-repeat="message in messages | filter : { archived: queryFilter.archived }">
<tr ng-repeat="message in messages | filter : queryFilter track by $index">
我收到此错误:
错误:[filter:notarray]
预期数组但收到:{}
过滤确实有效,但我想知道为什么会收到错误。
答案 0 :(得分:5)
答案 1 :(得分:4)
您的messages
必须包含Object
形式的数据,而不是Array
形式。
这就是抛出这个错误的原因。查看文档https://docs.angularjs.org/error/filter/notarray
来自文档:
过滤器必须与数组一起使用,以便项目的子集可以 回。该数组可以异步初始化,因此 null或undefined不会抛出此错误。
因此,请确保您的$scope.messages
包含数组形式的数据不是对象形式。
答案 2 :(得分:3)
queryfilter是一个对象而不是一个数组。因此,在queryfilter上应用ng-repeat,如下所示
<tr ng-repeat = "message in messages | filter : queryFilter track by $index">
如果queryfilter是数组,那么只需使用
<tr ng-repeat = "message in messages | filter : queryFilter">
跟踪$ index是必要的
答案 3 :(得分:2)
$ index的轨道使得角度语法不正确,因为它直接位于过滤器指令的后面。尝试将其移至后面重复声明,以便在track by和filter语句之间有明确的分离。
<tr ng-repeat="message in messages | filter : queryFilter track by $index">