Я новичок в Angular и хотел бы узнать лучший способ справиться с проблемой. Моя цель - использовать многоразовые средства для создания группы по заголовкам. Я создал решение, которое работает, но я думаю, что это должна быть директива вместо функции области видимости внутри моего контроллера, но я не уверен, как это сделать, или если директива - это даже правильный путь. Любые входы были бы весьма полезны.Группа AngularJS по директиве без внешних зависимостей
Смотрите мой текущий подход работает на jsFiddle
В HTML это простой список с помощью нг-повтор, когда я называю мою функцией newGrouping() на нг-шоу. Функция передает ссылку на полный список, поле, которое я хочу сгруппировать, и текущий индекс.
<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(), которая просто сравнивает ток к предыдущему, за исключением первого пункта, и возвращает истину или ложь в зависимости от матча.
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
- аЬс
- Защиту
Группа 2
- GHI
- JKL
- MnO
Он чувствует, что должен быть лучший способ. Я хочу, чтобы это была общая функция утилиты, которую я могу повторно использовать. Должна ли быть директива? Есть ли лучший способ ссылаться на предыдущий элемент в списке, чем мой метод передачи полного списка и текущего индекса? Как я подхожу к директиве для этого?
Любые советы приветствуются.
UPDATE: поиск ответа, который не требует внешних зависимостей. Существуют хорошие решения с использованием подчеркивания/lodash или модуля углового фильтра.
Дэррил
Это интересная проблема. Ваш предоставленный пример создаст избыточные группы, если группировки не будут смежными. Другими словами, если мы, например, добавили еще один элемент в конце, который находится в группе 1, будет создан дополнительный заголовок группы 1. Является ли это преднамеренным, или они должны быть сгруппированы, как следует из названия? Если вы поясните это, я могу предоставить директивное решение. Вы правы, что директива - это путь. – jelinson
Всякий раз, когда групповое использование используется в программировании, порядок данных, конечно, влияет на него, как вы описали. Я сделал мой пример максимально простым, поэтому предположим, что данные отсортированы правильно. – Darryl
Вы проверили угловой фильтр? https://github.com/a8m/angular-filter#groupby – hcarreras