У меня есть набор плиток, на которых отображается определенное количество в зависимости от того, какой вариант выбран пользователем. Теперь я хотел бы реализовать сортировку по любому показанному номеру.
В приведенном ниже коде показано, как я его реализовал (путем получения / установки значения в области родительских карт). Теперь, поскольку функция orderBy принимает строку, я попытался установить в области карты переменную под названием curOptionValue и отсортировать по ней, но, похоже, это не сработало.
Возникает вопрос: как создать пользовательскую функцию сортировки?
<div ng-controller="aggViewport" >
<div class="btn-group" >
<button ng-click="setOption(opt.name)" ng-repeat="opt in optList" class="btn active">{{opt.name}}</button>
</div>
<div id="container" iso-grid width="500px" height="500px">
<div ng-repeat="card in cards" class="item {{card.class}}" ng-controller="aggCardController">
<table width="100%">
<tr>
<td align="center">
<h4>{{card.name}}</h4>
</td>
</tr>
<tr>
<td align="center"><h2>{{getOption()}}</h2></td>
</tr>
</table>
</div>
</div>
и контроллер:
module.controller('aggViewport',['$scope','$location',function($scope,$location) {
$scope.cards = [
{name: card1, values: {opt1: 9, opt2: 10}},
{name: card1, values: {opt1: 9, opt2: 10}}
];
$scope.option = "opt1";
$scope.setOption = function(val){
$scope.option = val;
}
}]);
module.controller('aggCardController',['$scope',function($scope){
$scope.getOption = function(){
return $scope.card.values[$scope.option];
}
}]);
Принятое решение работает только с массивами, но не с объектами или ассоциативными массивами. К сожалению, поскольку Angular зависит от реализации перечисления массивов в JavaScript, порядок свойств объекта нельзя постоянно контролировать. Некоторые браузеры могут перебирать свойства объекта лексикографически, но это не может быть гарантировано.
например, учитывая следующее задание:
и директива
<ul ng-repeat="(key, card) in cards | orderBy:myValueFunction">
ng-repeat может перебирать «card1» до «card2», независимо от порядка сортировки.Чтобы обойти это, мы можем создать настраиваемый фильтр для преобразования объекта в массив, а затем применить настраиваемую функцию сортировки перед возвратом коллекции.
Мы не можем перебирать пары (ключ, значение) в сочетании с настраиваемыми фильтрами (поскольку ключи для массивов являются числовыми индексами), поэтому шаблон должен быть обновлен, чтобы ссылаться на введенные имена ключей.
Вот рабочая скрипка, использующая настраиваемый фильтр для ассоциативного массива: http://jsfiddle.net/av1mLpqx/1/
Ссылка: https://github.com/angular/angular.js/issues/1286#issuecomment-22193332
источник
Следующая ссылка очень хорошо объясняет фильтры в Angular. Он показывает, как можно определить собственную логику сортировки в ng-repeat. http://toddmotto.com/everything-about-custom-filters-in-angular-js
Для сортировки объекта со свойствами я использовал следующий код: (Обратите внимание, что эта сортировка является стандартным методом сортировки JavaScript и не относится к angular). Имя столбца - это имя свойства, для которого должна выполняться сортировка.
источник
Чтобы включить направление вместе с функцией orderBy:
где
источник
myOrderbyFunction()
вместо этого, вы должны писатьmyOrderbyFunction
без()
, он вызывается для каждой пары элементов, чтобы вы могли обеспечить пользовательскую сортировку.