Сортировка элементов в AngularJS для вложенных ng-repeat
Я использую bootstrap для отображения сетки проектов с каждой строкой, имеющей 3 столбца. Для этого я использую ng-repeat дважды, как показано ниже.
<div class="row" ng-repeat="chunk in projects">
<div class="col-sm-4" ng-repeat="project in chunk | orderBy:'title'">
{{project.title}}
</div>
</div>
Я хочу иметь возможность сортировать проект на основе его поля заголовка. Применение фильтра только сортирует подмножество всего списка, т.е. сортирует на уровне чанков, а не на уровне проектов.
var projects = [[{"title":"Z"},{"title":"A"},{"title":"M"}],
[{"title":"Z"},{"title":"A"},{"title":"M"}]];
После того, как упорядочен порядок, строки A M Z, A M Z. Как я могу получить для отображения A A M, M Z Z?
Вот план для вышеуказанной проблемы. // РЕДАКТИРОВАТЬ: вышеуказанный план указывает на решение, потому что я обновил план.
3 ответа
Я смог решить эту проблему, наконец, с помощью цепочки фильтров. Я использовал модуль / библиотеку углового фильтра, но это можно сделать даже без углового фильтра.
<div class="container" ng-controller="ExampleController as exampleVm">
<div class="row" ng-repeat="chunk in exampleVm.projects| chunkBy: 'title' | groupBy : 3">
<div class="col-sm-4" ng-repeat="project in chunk">
{{project.title}}
</div>
</div>
Я сплющил массив и сделал его похожим на это.
var projects = [{"title:Z"},{"title":"A"},{"title":"M"},{"title:Z"},{"title":"A"},{"title":"M"}]
В цепочке фильтров я упорядочиваю элементы в уплощенном массиве сначала по заголовку, а затем делю его на подмассивы по 3 элемента в каждом. Надеюсь это поможет.
Вы можете найти планк здесь.
Вам понадобится специальный фильтр, который превратит ваши вложенные массивы в один массив. Весь смысл наличия отдельных массивов состоит в том, чтобы изолировать содержимое, что противоположно тому, что вы хотите.
Фильтр:
yourAppModule
.filter('titleSort', function(){
return function(input){
var fullArray = []; //Will be the output array
for(var i=0;i<input.length;i++)
fullArray.concat(input[i]);
//Iterates through all the arrays in input (projects)
//and merges them into one array
fullArray = fullArray.sort(function(a,b){return a.title>b.title});
//Sorts it by the title property
var chunks = [];
var currentChunk;
for(var i=0;i<fullArray.length;i++){
if(i%3===0){
currentChunk = [];
chunks.push(currentChunk);
}
currentChunk.push(fullArray[i]);
}
return chunks;
};
} ...
Теперь ваша точка зрения может быть такой:
<div class="col-sm-4" ng-repeat="project in projects | titleSort">
{{project.title}}
</div>
Попробуй это. может быть, поможет вам
var app = angular.module("app",[])
app.controller('ctrl',['$scope', function($scope){
$scope.data = [[{"title":"Z"},{"title":"A"},{"title":"M"}],
[{"title":"Z"},{"title":"A"},{"title":"M"}]];
$scope.data2 = [];
angular.forEach( $scope.data,function(d){
angular.forEach(d,function(d1){
$scope.data2.push(d1);
})
})
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<div ng-app="app" ng-controller="ctrl">
<div class="item item-checkbox">
<div class="row">
<div class="col-sm-4" ng-repeat="project in data2 | orderBy:'title'">
{{project.title}}
</div>
</div>
</div>