Я новичок в Angular и хотел бы узнать лучший способ справиться с проблемой. Моя цель - использовать многоразовые средства для создания группы по заголовкам. Я создал решение, которое работает, но я думаю, что это должна быть директива вместо функции области видимости внутри моего контроллера, но я не уверен, как это сделать, или если директива - это даже правильный путь. Любые входные данные будут с благодарностью.
Смотрите мой текущий подход, работающий над jsFiddle
В HTML это простой список с использованием ng-repeat, где я вызываю функцию newGrouping() на ng-show. Функция передает ссылку на полный список, поле, которое я хочу сгруппировать, и текущий индекс.
<div ng-app>
<div ng-controller='TestGroupingCtlr'>
<div ng-repeat='item in MyList'>
<div ng-show="newGrouping($parent.MyList, 'GroupByFieldName', $index);">
<h2>{{item.GroupByFieldName}}</h2>
</div>
{{item.whatever}}
</div>
</div>
</div>
В моем контроллере у меня есть функция newGrouping(), которая просто сравнивает текущий с предыдущим, кроме первого элемента, и возвращает true или false в зависимости от соответствия.
function TestGroupingCtlr($scope) {
$scope.MyList = [
{GroupByFieldName:'Group 1', whatever:'abc'},
{GroupByFieldName:'Group 1', whatever:'def'},
{GroupByFieldName:'Group 2', whatever:'ghi'},
{GroupByFieldName:'Group 2', whatever:'jkl'},
{GroupByFieldName:'Group 2', whatever:'mno'}
];
$scope.newGrouping = function(group_list, group_by, index) {
if (index > 0) {
prev = index - 1;
if (group_list[prev][group_by] !== group_list[index][group_by]) {
return true;
} else {
return false;
}
} else {
return true;
}
};
}
Результат будет выглядеть следующим образом.
Группа 1
- ABC
- Защита
Группа 2
- ГХИ
- JKL
- mno
Кажется, должен быть лучший способ. Я хочу, чтобы это была общая функция утилиты, которую я могу повторно использовать. Должна ли быть директива? Есть ли лучший способ ссылаться на предыдущий элемент в списке, чем мой метод передачи полного списка и текущего индекса? Как я подхожу к директиве для этого?
Приветствуются любые советы.
UPDATE: поиск ответа, который не требует внешних зависимостей. Существуют хорошие решения с использованием underscore/lodash или модуля angular -filter.
Дэррил