对json对象进行ng-repeat过滤

时间:2017-11-14 12:29:29

标签: angularjs angularjs-filter

我有一个复杂的JSON结构如下:

我的JSON对象就像 -

$scope.data = {
    "Test 1": [
      {
          "paperName": "Physics Test",
          "lkExamTypePk": 1,
          "paperPK": "20",
          "lkExamType": 2
      }
    ],
    "Test 2": [
      {
          "paperName": "Maths Test",
          "lkExamTypePk": 2,
          "paperPK": "23",
          "lkExamType": 3
      }
    ]
}

我正在使用这个json在我的html页面中显示并想要搜索测试1,测试2等的键:

<input ng-model="filter.key" />
<table>
    <tr ng-repeat="(key,val) in controllerName.data | filter:filter.key">
        <td>
            {{key}}
        </td>
    </tr>
</table>  

但问题是过滤器在数组和JSON的值上工作,我得到的错误不是数组。

我在控制台上遇到的错误

  

错误:[filter:notarray]

enter image description here

1 个答案:

答案 0 :(得分:2)

我认为你的问题在于如何引用你的变量。我可以看到你将data数组声明为$scope变量

$scope.data = { ... }

然后,您尝试使用

参考您的控制器来访问它
controllerName.data

您可以遵循两种不同的方法,但不能将它们混合使用。

1)$ scope variabile

如果您想加入$scope,您必须在控制器中声明您的变量,如下所示:

$scope.data = { ... }

然后进入html你必须像这样引用它(没有controllerName):

<tr ng-repeat="(key,val) in data | filter:filter.key">

2)控制器范围

如果你想进入控制器的范围,你必须在你的控制器中声明你的变量如下:

this.data = { ... }

然后进入html你可以像这样引用它:

<tr ng-repeat="(key,val) in controllerName.data | filter:filter.key">

<强>提示

通常情况下,当您收到引用变量的错误时,最佳做法是将变量的数据打印到html中以检查您是否正在使用它,例如:

<pre>{{ data | json }}</pre>

尝试使用数组而不是对象

您可以尝试使用json对象的数组intead,如错误所示,如下所示:

$scope.data = [
    "Test 1": [{
      "paperName": "Physics Test",
      "lkExamTypePk": 1,
      "paperPK": "20",
      "lkExamType": 2
    }],
    "Test 2": [{
      "paperName": "Maths Test",
      "lkExamTypePk": 2,
      "paperPK": "23",
      "lkExamType": 3
    }]
  ]