【问题标题】:How to iterate over the keys and values with ng-repeat in AngularJS?如何在 AngularJS 中使用 ng-repeat 迭代键和值?
【发布时间】:2013-02-14 04:32:41
【问题描述】:

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

现在这个数据是包含来自json 的键和值的字典。

我可以在模板中使用object.name 访问该属性。有什么方法可以让我也可以遍历键并将它们显示在表格中,如

<tr><td> {{key}} </td> <td> data.key </td>

数据是这样的

{
    "id": 2,
    "project": "wewe2012",
    "date": "2013-02-26",
    "description": "ewew",
    "eet_no": "ewew",
}

【问题讨论】:

    标签: angularjs angularjs-ng-repeat


    【解决方案1】:

    我认为 Angular 中没有内置函数可以执行此操作,但您可以通过创建一个包含所有标题名称的单独范围属性来执行此操作,并且您可以像这样自动填充此属性:

    var data = {
      foo: 'a',
      bar: 'b'
    };
    
    $scope.objectHeaders = [];
    
    for ( property in data ) {
      $scope.objectHeaders.push(property); 
    }
    
    // Output: [ 'foo', 'bar' ]
    

    【讨论】:

    • 如果需要循环访问角度控制器内的数据(OP 要求查看循环),您的答案可以正常工作。
    【解决方案2】:

    怎么样:

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

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

    【讨论】:

    • 它应该可以工作:plnkr.co/edit/7AQF6k7hf2aZbWFmhVoX?p=preview。你能修改它直到它停止工作吗?
    • 它就像一个魅力。唯一的问题是它将按字母顺序排列,因此如果项目顺序与显示相关,则命名很重要。
    • @IsabelHM 出于多种原因,我们很多人都建议不要迭代ngRepeat 中的对象。事实上,我曾经听说过一个核心团队成员后悔曾经实现过这样做的能力!通常最好将控制器中的对象转换为数组;这使意图更加清晰,并降低了在某些情况下出现奇怪/不可预测行为的风险。您可以按照通常的方式进行排序。 :-)
    • 正如 IsabelHM 所说,输出按名称的字母顺序排列。有没有办法强制它不这样做?
    • @sethflowers 正如我在之前的评论中提到的,我不建议迭代对象中的键。最好将其转换为控制器中的数组。假设没有基于您的业务模型的惯用方式来做到这一点,ES6 让它变得非常简单:Object.getOwnPropertyNames(data).map(k =&gt; ({key:k, value:data[k]));
    【解决方案3】:

    如果您想通过两种方式绑定来编辑属性值:

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

    【讨论】:

    • 谢谢!出于好奇,您是否在某个地方的文档中找到了这种技术?我徒劳地搜索,直到在这里找到你的答案。
    • @cbk:这就是我要找的……谢谢
    • 非常感谢,你拯救了我的一天 :)
    • @cbk 这和使用ng-model="value"不一样吗?
    • @MikeHarrison ng-repeat 本质上是遍历对象并返回键值对。把它想象成for(var value in arrayOfValues) { ... }。如果您在循环中重新分配变量 value,则不会更改 arrayOfValues 内部的内容,您只是将 value 重新指向一个新对象。
    【解决方案4】:

    一个 todo 列表 示例,它通过 ng-repeat 循环遍历对象:

    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;
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <body ng-app="toDolistApp">    
      <div ng-controller="toDoListCntrl as toDoListCntrlAs">
        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/>
        <div ng-repeat="(key, prop) in toDoListCntrlAs.toDoListItems"> 
          <span>{{$index+1}} : {{key}}   : Title = {{ prop.title}} : Status = {{ prop.completed}} </span>
        </div>     
      </div>    
    </body>

    【讨论】:

    • 关于不使用方括号的评论真的很有帮助。该更改修复了我的代码。谢谢。
    • 我也是。有人可以解释为什么使用大括号修复了我的代码吗?
    【解决方案5】:

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

    Javascript

    $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

    <p ng-repeat="obj in data">
       <font ng-repeat="(key, value) in obj">
          {{key}} : {{value}}
       </font>
    </p>
    

    【讨论】:

    • 不允许重复关键字
    【解决方案6】:

    此处的完整示例:-

    <!DOCTYPE html >
    <html ng-app="dashboard">
    <head>
    <title>AngularJS</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <link rel="stylesheet" href="./bootstrap.min.css">
    <script src="./bootstrap.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js"></script>
    </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);
    } 
        });
    </script>
    </html>
    

    【讨论】:

      【解决方案7】:

      您可以在 javascript(控制器)或 html(角度视图)中执行此操作...

      js:

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

      html:

      <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

      【讨论】:

        【解决方案8】:
            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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-25
          • 1970-01-01
          • 2014-10-14
          相关资源
          最近更新 更多