如何在AngularJS中使用ng-repeat迭代键和值?
在我的控制器中,我有这样的数据: $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", }
怎么样:
<table> <tr ng-repeat="(key, value) in data"> <td> {{key}} </td> <td> {{ value }} </td> </tr> </table>
此方法在文档中列出: http ://docs.angularjs.org/api/ng.directive: ngRepeat
如果您想用双向绑定编辑属性值:
<tr ng-repeat="(key, value) in data"> <td>{{key}}<input type="text" ng-model="data[key]"></td> </tr>
我不认为这样做有angular度的内置函数,但你可以通过创build一个包含所有标题名称的独立的范围属性来做到这一点,你可以自动填充这个属性:
var data = { foo: 'a', bar: 'b' }; $scope.objectHeaders = []; for ( property in data ) { $scope.objectHeaders.push(property); } // Output: [ 'foo', 'bar' ]
通过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>
我们可以按照下面的步骤来避免按字母顺序显示键值。
使用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>
完整的例子在这里: –
<!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>
你可以在你的JavaScript(控制器)或在你的HTML(angular度视图)…
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>
我相信的方式是更多的angular度,但你也可以在你的控制器做,并在您的HTML检索…
也不是一个坏主意看对象的关键,他们给你一个关键的数组,如果你需要他们,更多的信息在这里:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
这是一个工作的例子:
<div class="item item-text-wrap" ng-repeat="(key,value) in form_list"> <b>{{key}}</b> : {{value}} </div>
编辑
- Twitter引导程序和Angular.js之间的真实(或隐藏)区别
- 如何在AngularJS中设置一个variables的iframe src属性
- AngularJS错误:'参数'FirstCtrl'不是一个函数,得到未定义'
- orderBy之后Angularjs错误$ index
- 是否有可能使用Angular进行树视图?
- 如何在angular度路由中传递查询string?
- 嘲笑Jasmineunit testing中的Angular模块依赖关系
- 什么是angular-loader.js?
- Bootstrap,Angular.js和Ember.js中使用的数据属性选项是否与Unobtrusive Javascript原则相冲突?