In my controller, I have data like:
$scope.object = data
Now this data is the dictionary with keys and values from json
.
I can access the attribute with object.name
in the template. Is there any way that I can iterate over the keys as well and display them in table like
<tr><td> {{key}} </td> <td> data.key </td>
The data is like this
{
"id": 2,
"project": "wewe2012",
"date": "2013-02-26",
"description": "ewew",
"eet_no": "ewew",
}
This question is related to
angularjs
angularjs-ng-repeat
Complete example here:-
<!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>
I don't think there's a builtin function in angular for doing this, but you can do this by creating a separate scope property containing all the header names, and you can fill this property automatically like this:
var data = {
foo: 'a',
bar: 'b'
};
$scope.objectHeaders = [];
for ( property in data ) {
$scope.objectHeaders.push(property);
}
// Output: [ 'foo', 'bar' ]
If you would like to edit the property value with two way binding:
<tr ng-repeat="(key, value) in data">
<td>{{key}}<input type="text" ng-model="data[key]"></td>
</tr>
we can follow below procedure to avoid display of key-values in alphabetical order.
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>
You can do it in your javascript (controller) or in your html (angular view)...
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>
I believe the html way is more angular , but you can also do in your controller and retrieve it in your html...
also not a bad idea to look at the Object keys, they give you the an array of the keys if you need them, more info here:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
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.
A todo list example which loops over object by ng-repeat
:
var app = angular.module('toDolistApp', []);_x000D_
app.controller('toDoListCntrl', function() {_x000D_
var self = this;_x000D_
self.toDoListItems = {};// []; //dont use square brackets if keys are string rather than numbers._x000D_
self.doListCounter = 0;_x000D_
_x000D_
self.addToDoList = function() { _x000D_
var newToDoItem = {};_x000D_
newToDoItem.title = self.toDoEntry;_x000D_
newToDoItem.completed = false; _x000D_
_x000D_
var keyIs = "key_" + self.doListCounter++; _x000D_
_x000D_
self.toDoListItems[keyIs] = newToDoItem; _x000D_
self.toDoEntry = ""; //after adding the item make the input box blank._x000D_
};_x000D_
});_x000D_
_x000D_
app.filter('propsCounter', function() {_x000D_
return function(input) {_x000D_
return Object.keys(input).length;_x000D_
}_x000D_
});
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>_x000D_
<body ng-app="toDolistApp"> _x000D_
<div ng-controller="toDoListCntrl as toDoListCntrlAs">_x000D_
Total Items: {{toDoListCntrlAs.toDoListItems | propsCounter}}<br />_x000D_
Enter todo Item: <input type="text" ng-model="toDoListCntrlAs.toDoEntry"/>_x000D_
<span>{{toDoListCntrlAs.toDoEntry}}</span>_x000D_
<button ng-click="toDoListCntrlAs.addToDoList()">Add Item</button> <br/>_x000D_
<div ng-repeat="(key, prop) in toDoListCntrlAs.toDoListItems"> _x000D_
<span>{{$index+1}} : {{key}} : Title = {{ prop.title}} : Status = {{ prop.completed}} </span>_x000D_
</div> _x000D_
</div> _x000D_
</body>
_x000D_
Here's a working example:
<div class="item item-text-wrap" ng-repeat="(key,value) in form_list">
<b>{{key}}</b> : {{value}}
</div>
edited
Source: Stackoverflow.com