2016-05-22 88 views
3

我有一个项目列表,我用ng-repeat显示。我想添加一个过滤器来显示/隐藏已归档的项目。AngularJS ng-repeat with filter - notarray error

我已经添加了一个复选框:

<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"> 

我得到这个错误:

Error: [filter:notarray]

Expected array but received: {}

过滤确实工作,但我想知道为什么我收到错误。

+0

什么你的按摩结构?这个“存档:真/假”并不意味着什么 –

回答

4

您的messages必须包含Object表格中的数据,而不是在Array表格中。

这就是为什么会抛出这个错误。检查文档https://docs.angularjs.org/error/filter/notarray

从文档:

Filter must be used with an array so a subset of items can be returned. The array can be initialized asynchronously and therefore null or undefined won't throw this error.

所以一定要确保,在阵列形式的$scope.messages包含数据而不是在对象的形式。

1

由$ index创建的轨道使角度语法不正确,因为它直接位于过滤器指令后面。尝试将它移到repeat语句后面,以便在跟踪语句和过滤语句之间有明确的分离。

<tr ng-repeat="message in messages track by $index | filter : queryFilter"> 
2

我已经初始化为messages作为对象。

$scope.messages = {};更改为$scope.messages = [];使错误消失。

0

queryfilter是一个对象而不是数组。因此,适用于queryfilter的NG-重复下面 <tr ng-repeat = "message in messages | filter : queryFilter track by $index">

给出如果queryfilter是数组,那么只需$指数使用

<tr ng-repeat = "message in messages | filter : queryFilter">

轨道是必要的,每当我们循环对象