Angular ng-repeat условные элементы обертывания в элементе (элементы группы в ng-repeat)
Я пытаюсь сгруппировать элементы в ng-repeat, используя условие.
Примером является объединение всех элементов с тем же часом.
Данные:
[
{name: 'AAA', time: '12:05'},
{name: 'BBB', time: '12:10'},
{name: 'CCC', time: '13:20'},
{name: 'DDD', time: '13:30'},
{name: 'EEE', time: '13:40'},
...
]
Поле "время" на самом деле является меткой времени (1399372207), но с точным временем вывод примера легче понять.
Я перечисляю эти элементы, используя ng-repeat:
<div ng-repeat="r in data| orderBy:sort:direction">
<p>{{r.name}}</p>
</div>
также попытался:
<div ng-repeat-start="r in data| orderBy:sort:direction"></div>
<p>{{r.name}}</p>
<div ng-repeat-end></div>
Допустимым является:
<div class="group-class">
<div><p>AAA</p></div>
<div><p>BBB</p></div>
</div>
<div class="group-class">
<div><p>CCC</p></div>
<div><p>DDD</p></div>
<div><p>EEE</p></div>
</div>
Моя последняя опция, если нет простого решения для моей проблемы, - это сгруппировать данные, а затем назначить ее переменной области, используемой в ng-repeat.
Любые мысли?
Ответы
Ответ 1
Вы можете использовать фильтр groupBy модуля angular.filter.
поэтому вы можете сделать что-то вроде этого:
использование: collection | groupBy:property
использовать вложенное свойство с точечной записью: property.nested_property
JS:
$scope.players = [
{name: 'Gene', team: 'alpha'},
{name: 'George', team: 'beta'},
{name: 'Steve', team: 'gamma'},
{name: 'Paula', team: 'beta'},
{name: 'Scruath', team: 'gamma'}
];
HTML:
<ul ng-repeat="(key, value) in players | groupBy: 'team'">
Group name: {{ key }}
<li ng-repeat="player in value">
player: {{ player.name }}
</li>
</ul>
РЕЗУЛЬТАТ:
Название группы: alpha
* игрок: Gene
Название группы: бета
* игрок: George
* игрок: Паула
Название группы: gamma
* игрок: Стив
* игрок: Scruath
ОБНОВЛЕНИЕ: jsbin
Ответ 2
Сначала создайте группу в контроллере:
$scope.getGroups = function () {
var groupArray = [];
angular.forEach($scope.data, function (item, idx) {
if (groupArray.indexOf(parseInt(item.time)) == -1) {
groupArray.push(parseInt(item.time));
}
});
return groupArray.sort();
};
Затем создайте для него фильтр:
myApp.filter('groupby', function(){
return function(items,group){
return items.filter(function(element, index, array) {
return parseInt(element.time)==group;
});
}
}) ;
Затем измените шаблон:
<div ng-repeat='group in getGroups()'>
<div ng-repeat="r in data | groupby:group" class="group-class">
<div><p>{{r.name}}</p></div>
</div>
</div>
ВИДЕТЬ DEMO