Below is my plunker where I have tried to display the data under each category.But the data are not printing as supposed to .Example:-rom value 12345 should come directly under bread.
I'm not sure where I'm doing wrong in my code:
$scope.allProducts = [];
angular.forEach($scope.data,function(item, index){
angular.forEach(item.products, function(item2, index){
if($scope.allProducts.indexOf(item2.consummable) == -1){
$scope.allProducts.push(item2.consummable);
}
})
})
Creating a table matrix
Yet another variant with changed ng-repeat
expression. Since you repeat allProducts in first line, you need repeat it and in others, and filter data for selected value. See code snippet below
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.data =[
{
"resource": "100",
products: [
{
"consummable": "milk",
"rom": 1
},
]
},
{
"resource": "200",
products: [
{
"consummable": "bread",
"rom": 12345
},
]
},
{
"resource": "300",
products: [
{
"consummable": "butter",
"rom": 123456789
}
]
}
];
$scope.allProducts = [];
angular.forEach($scope.data,function(item, index){
angular.forEach(item.products, function(item2, index){
if($scope.allProducts.indexOf(item2.consummable) == -1){
$scope.allProducts.push(item2.consummable);
}
})
})
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.17/angular.min.js"></script>
<div ng-app="plunker" ng-controller="MainCtrl">
<p>Hello {{name}}!</p>
<table style="border:1px solid red;">
<tr>
<td>
</td>
<td ng-repeat="itemProd in allProducts" style="border:1px solid red;">
{{itemProd}}
</td>
</tr>
<tr ng-repeat="item in data">
<td>
{{item.resource}}
</td>
<td ng-repeat="item2 in allProducts" style="border:1px solid red;" ng-init="product=(item.products | filter: {consummable:item2})[0]">
<a>{{product.rom}}</a>
</td>
</tr>
</table>
{{allProducts}}
{{data}}
</div>
Please check the structure :
<table style="border : 1px solid">
<tr>
<td></td>
<td ng-repeat="product in allProducts">
{{product.consummable}}
</td>
</tr>
<tr ng-repeat="test in data">
<td>{{test.resource}}</td>
<td ng-repeat="pro in allProducts">{{pro.rom}}</td>
</tr>
And just push item2 in allProducts instead of consummable field only :
angular.forEach($scope.data,function(item, index){
angular.forEach(item.products, function(item2, index){
if($scope.allProducts.indexOf(item2.consummable) == -1){
$scope.allProducts.push(item2); // Here I have pushed item2 instead of item2.consummable
}
})
})
Plunker : http://plnkr.co/edit/YWPL2EmKK6MIwIkevZ1W?p=preview
The solution for what you need is the following:
1) keep the allProducts generation like this:
$scope.allProducts = [];
angular.forEach($scope.data,function(item, index){
angular.forEach(item.products, function(item2, index){
if($scope.allProducts.indexOf(item2.consummable) == -1){
$scope.allProducts.push(item2.consummable);
}
})
})
2) Add this in your controller:
$scope.getColumnValue = function(item,item2, index) {
var returnVal;
angular.forEach(item.products, function(val, index){
if(item2 == val.consummable){
returnVal = val.rom;
}
})
return returnVal;
}
3) The table generation will be:
<table style="border:1px solid red;">
<tr>
<td>
</td>
<td ng-repeat="itemProd in allProducts" style="border:1px solid red;">
{{itemProd}}
</td>
</tr>
<tr ng-repeat="item in data">
<td>
{{item.resource}}
</td>
<td ng-repeat="item2 in allProducts" style="border:1px solid red;">
<a>{{getColumnValue(item, item2)}}</a>
</td>
</tr>
</table>