如何在AngularJS中使用ng-repeat迭代键和值?

How to iterate over the keys and values with ng-repeat in AngularJS?

在我的控制器中,我有如下数据:$scope.object = data

现在,这些数据是带有来自json的键和值的字典。

我可以使用模板中的object.name访问属性。我是否也可以迭代这些键并在表中显示它们

{{key}} data.key

数据是这样的

1
2
3
4
5
6
7
{
   "id": 2,
   "project":"wewe2012",
   "date":"2013-02-26",
   "description":"ewew",
   "eet_no":"ewew",
}

怎么样:

1
2
3
4
5
<table>
  <tr ng-repeat="(key, value) in data">
    <td> {{key}} </td> <td> {{ value }} </td>
  </tr>
</table>

此方法在文档中列出:https://docs.angularjs.org/api/ng/directive/ngrepeat


如果要使用双向绑定编辑属性值:

1
2
3
<tr ng-repeat="(key, value) in data">
    <td>{{key}}<input type="text" ng-model="data[key]"></td>
</tr>


我认为在Angular中没有内置函数可以实现这一点,但是您可以通过创建包含所有头名称的单独范围属性来实现这一点,并且您可以像这样自动填充该属性:

1
2
3
4
5
6
7
8
9
10
11
12
var data = {
  foo: 'a',
  bar: 'b'
};

$scope.objectHeaders = [];

for ( property in data ) {
  $scope.objectHeaders.push(property);
}

// Output: [ 'foo', 'bar' ]


我们可以按照下面的过程来避免按字母顺序显示键值。

JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$scope.data = {
  "id": 2,
  "project":"wewe2012",
  "date":"2013-02-26",
  "description":"ewew",
  "eet_no":"ewew",
};
var array = [];
for(var key in $scope.data){
    var test = {};
    test[key]=$scope.data[key];
    array.push(test);
}
$scope.data = array;

HTML

1
2
3
4
5
6
<p ng-repeat="obj in data">
   <font ng-repeat="(key, value) in obj">
      {{key}} : {{value}}
   </font>

</p>


通过ng-repeat循环对象的TODO列表示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var app = angular.module('toDolistApp', []);
app.controller('toDoListCntrl', function() {
  var self = this;
  self.toDoListItems = {};// []; //dont use square brackets if keys are string rather than numbers.
  self.doListCounter = 0;

  self.addToDoList = function() {                  
    var newToDoItem = {};
    newToDoItem.title     = self.toDoEntry;
    newToDoItem.completed = false;         

    var keyIs ="key_" + self.doListCounter++;          

    self.toDoListItems[keyIs] = newToDoItem;           
    self.toDoEntry =""; //after adding the item make the input box blank.
  };
});

app.filter('propsCounter', function() {
  return function(input) {
    return Object.keys(input).length;
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js">
<body ng-app="toDolistApp">    
 
    Total Items: {{toDoListCntrlAs.toDoListItems | propsCounter}}<br />
    Enter todo Item:  <input type="text" ng-model="toDoListCntrlAs.toDoEntry"/>
    <span>{{toDoListCntrlAs.toDoEntry}}</span>
    <button ng-click="toDoListCntrlAs.addToDoList()">Add Item</button> <br/>
     
      <span>{{$index+1}} : {{key}}   : Title = {{ prop.title}} : Status = {{ prop.completed}} </span>
         
     
</body>


1
2
3
4
5
6
    Use below code it is working to display your key and value here is key start with 1:
         <tr ng-repeat="(key,value) in alert_list">
                   <td>{{key +1}}</td>
                   <td>{{value.title}}</td>
                 </tr>
Below is document link for it.

https://docs.angularjs.org/api/ng/directive/ngrepeat/重复


完整示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<!DOCTYPE html >
<html ng-app="dashboard">
<head>
AngularJS
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js">
<link rel="stylesheet" href="./bootstrap.min.css">
<script src="./bootstrap.min.js">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js">
</head>
<body ng-controller="myController">
    <table border='1'>
        <tr ng-repeat="(key,val) in collValues">
            <td ng-if="!hasChildren(val)">{{key}}</td>  
            <td ng-if="val === 'string'">
                <input type="text" name="{{key}}"></input>
            </td>
            <td ng-if="val === 'number'">
                <input type="number" name="{{key}}"></input>
            </td>
            <td ng-if="hasChildren(val)" td colspan='2'>
                <table border='1' ng-repeat="arrVal in val">
                    <tr ng-repeat="(key,val) in arrVal">
                        <td>{{key}}</td>    
                        <td ng-if="val === 'string'">
                            <input type="text" name="{{key}}"></input>
                        </td>
                        <td ng-if="val === 'number'">
                            <input type="number" name="{{key}}"></input>
                        </td>
                    </tr>
                </table>                
            </td>

        </tr>      
    </table>
</body>

<script type="text/javascript">

    var app = angular.module("dashboard",[]);
    app.controller("myController",function($scope){
        $scope.collValues = {
            'name':'string',
            'id':'string',
            'phone':'number',
            'depart':[
                    {
                        'depart':'string',
                        'name':'string'
                    }
            ]  
        };

        $scope.hasChildren = function(bigL1) {
            return angular.isArray(bigL1);
}
    });

</html>

您可以在JavaScript(控制器)或HTML(角度视图)中执行此操作…

JS:

1
2
3
4
$scope.arr = [];
for ( p in data ) {
  $scope.arr.push(p);
}

HTML:

1
2
3
<tr ng-repeat="(k, v) in data">
    <td>{{k}}<input type="text" ng-model="data[k]"></td>
</tr>

我相信HTML的方式更有棱角,但你也可以在你的控制器中做,并在你的HTML中检索它…

另外,查看对象键也不是一个坏主意,如果需要,它们会给您一个键数组,更多信息如下:

https://developer.mozilla.org/en/docs/web/javascript/reference/global_objects/object/keys


下面是一个工作示例:

1
  {{key}} : {{value}}

编辑