0

Я использую bootstrap для отображения сетки проектов с каждой строкой, имеющей 3 столбца. Для этого я использую ng-repeat дважды, как показано ниже.Сортировка элементов в AngularJS для вложенных 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"}]]; 

После OrderBy происходит, строки A M Z, A M Z. Как получить его для отображения A A M, M Z Z?

Описание проблемы plunk. // РЕДАКТИРОВАТЬ: Вышеупомянутый планшет указывает на решение, потому что я обновил плунж.

+2

Почему вы ожидаете, что заказ на внутренний ng-repeat повлияет на внешний? Любой заказ на внешней стороне или рассмотрите возможность сглаживания вашей структуры данных во что-то, что более близко напоминает ваш результат. –

+0

Да, вам нужно будет сгладить структуру больше. – ryanyuyu

+0

Из того, что я понял, вы предлагаете изменить проекты как var = [{"title": "A"}, {"title:" B "}, {" title ":" C "}, {" title " : "А"}, { "название:" В "}, {" название ":" С "}]. Это создает проблему для другой проблемы. Я хочу, чтобы внешний div с классом row conatin составлял ровно три внутренних div с классом col-sm-4. Это не может быть достигнуто с помощью предлагаемой структуры данных. –

ответ

1

Я был в состоянии решить эту проблему, наконец, через фильтровальное сцепление. Я использовал модуль/библиотеку угловых фильтров, но это можно сделать даже без углового фильтра.

<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-х элементов в каждых. Надеюсь это поможет.

Вы можете найти плунж here.

+0

Я обновляю свой ответ. вставить загрузочный файл css? –

1

Вам понадобится настраиваемый фильтр, который превратит ваши подмассивы в один массив. Весь смысл иметь отдельные массивы - это изолировать содержимое, которое противоположно тому, что вы хотите.

Фильтр:

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> 
+0

Я хочу, чтобы div с строкой класса содержал ровно 3 div с классом col-sm-4. Поэтому, если в проектах есть более трех проектов, я хочу, чтобы дополнительные проекты вошли в новый div с классом. –

+0

@PravinUmamaheswaran Я отредактировал его, чтобы повторно разбить полный массив после его сортировки. –

+0

Я попробовал ваше отредактированное решение. Я получаю ошибку $ rootScope.infdig.Оказывается, модель для ng-repeat продолжает изменяться каждый раз, когда фильтр вызывается, что приводит к тому, что $ digest получает бесконечное количество раз. Я пытаюсь решить эту проблему, используя $ scope. $ Watch. Будет обновлен, если я выработаю решение. –

0

попробовать это. может помочь вам.

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>

+0

Я совершенно новичок в угловых js, и я не совсем понял блок углового.forEach(). Я пытался использовать этот код, как есть, но столбцы сетки не будут печататься. Я не знаю, если я что-то испортил или нет. –

+0

что вы хотите точно? Можете ли вы добавить картинку, как хотите? –

Смежные вопросы