Well, I'm wondering how I can do this join with angularjs? I saw that it has ng-repeat-start and end, but I could not implement it.
The merge feature in HTML
is rowspan
.
Original: The rowspan attributes specifies the number of rows to cell should span.
Free Translation: The rowspan attribute specifies the number of rows a cell should occupy.
Considering JSON
:
[
{
lab: 'Lab1',
slogan: 'slogan 1',
analista: 'Analista 1',
documento: 'Documento 1'
},
{
lab: 'Lab1',
slogan: 'slogan 1',
analista: 'Analista 2',
documento: 'Documento 2'
},
{
lab: 'Lab1',
slogan: 'slogan 1',
analista: 'Analista 3',
documento: 'Documento 3'
},
{
lab: 'Lab2',
slogan: 'slogan 2',
analista: 'Analista 4',
documento: 'Documento 4'
}
]
I created a organizar
function that turns it into:
[
{
lab: 'Lab1',
slogan: 'slogan 1',
documentos: [{
analista: 'Analista 1',
documento: 'Documento 1'
}, {
analista: 'Analista 2',
documento: 'Documento 2'
}, {
analista: 'Analista 3',
documento: 'Documento 3'
}]
},
{
lab: 'Lab2',
slogan: 'slogan 2',
documentos: [{
analista: 'Analista 4',
documento: 'Documento 4'
}]
}
]
So I applied rowspan
and traversed the element that was formed ( documentos
) to create the other lines. Note that I created an additional ng-repeat
that ignores the index record 0 so that the other rows are shown. Example working as follows:
angular
.module('meuModulo', []);
angular
.module('meuModulo')
.controller('MeuController', MeuController);
MeuController.$inject = [];
function MeuController() {
var vm = this;
iniciar();
function iniciar() {
var base = [{
lab: 'Lab1',
slogan: 'slogan 1',
analista: 'Analista 1',
documento: 'Documento 1'
},
{
lab: 'Lab1',
slogan: 'slogan 1',
analista: 'Analista 2',
documento: 'Documento 2'
},
{
lab: 'Lab1',
slogan: 'slogan 1',
analista: 'Analista 3',
documento: 'Documento 3'
},
{
lab: 'Lab2',
slogan: 'slogan 2',
analista: 'Analista 4',
documento: 'Documento 4'
}
];
ordenar(base);
}
function ordenar(base) {
var organizados = {};
vm.dados = [];
angular.forEach(base, function percorrer(item) {
if (angular.isUndefined(organizados[item.lab])) {
organizados[item.lab] = {};
organizados[item.lab].lab = item.lab;
organizados[item.lab].slogan = item.slogan;
organizados[item.lab].documentos = [];
}
organizados[item.lab].documentos.push({
analista: item.analista,
documento: item.documento
});
});
for (var lab in organizados) {
vm.dados.push(organizados[lab]);
}
}
}
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script><divng-app="meuModulo">
<div ng-controller="MeuController as vm">
<table>
<tbody ng-repeat='dado in vm.dados'>
<tr>
<td rowspan="{{dado.documentos.length}}">{{dado.lab}}</td>
<td rowspan="{{dado.documentos.length}}">{{dado.slogan}}</td>
<td>{{dado.documentos[0].analista}}</td>
<td>{{dado.documentos[0].documento}}</td>
</tr>
<tr ng-repeat='documento in dado.documentos' ng-if="$index > 0">
<td>{{documento.analista}}</td>
<td>{{documento.documento}}</td>
</tr>
</tbody>
</table>
</div>
</div>
Answer to a similar question in StackOverflow : Use of rowspan to group hierarchical data