Как я могу анимировать сортировку списка с помощью orderBy с помощью ng-repeat с ng-animate?

Я orderBy список объектов, используя ng-repeat с фильтром orderBy следующим образом:

  • Мои попытки изменить вид сортировки списка оказались разочаровывающими и не заслуживают внимания. Я видел пример приложения Yearofmoo здесь .

    К сожалению, эта демонстрация не совсем то, чего я пытаюсь достичь. Мне нужно анимировать позицию X данного элемента списка, когда он помещается в новый порядок после orderBy определения orderBy . Я попытался выполнить это с помощью css-переходов и абсолютного позиционирования, но ng-repeat похоже, воссоздает элементы списка на orderBy делая анимацию реальной проблемой.

    1. Возможно ли это с помощью ng-repeat | orderBy ng-repeat | orderBy (с или без ng-animate )?
    2. Можете ли вы предложить подход или привести пример?

    Итак, даже если @Alex Osborn показал способ делать то, что вы хотите в комментариях, вот моя попытка:

     angular.module('StackApp', []).controller('MainCtrl', function($scope) { 'use strict'; $scope.reverse = 'false'; $scope.myList = [{ id: 0, text: 'HTML5 Boilerplate' }, { id: 1, text: 'AngularJS' }, { id: 2, text: 'Karma' }, { id: 3, text: 'Hello' }, { id: 4, text: 'World' }, { id: 5, text: 'How' }, { id: 6, text: 'Are' }, { id: 7, text: 'You' }, { id: 8, text: '?' }, { id: 9, text: 'I' }, { id: 10, text: 'write' }, { id: 11, text: 'more' }, { id: 12, text: 'to' }, { id: 13, text: 'make' }, { id: 14, text: 'the' }, { id: 15, text: 'list' }, { id: 16, text: 'longer' }]; $scope.$watch('reverse', function() { $scope.setOrder(); }); $scope.setOrder = function() { if ($scope.reverse === 'random') { var t = []; for (var i = 0; i < $scope.myList.length; i++) { var r = Math.floor(Math.random() * $scope.myList.length); while (inArray(t, r)) { r = Math.floor(Math.random() * $scope.myList.length); } t.push(r); $scope.myList[i].order = r; } } else { for (var i = 0; i < $scope.myList.length; i++) { if ($scope.reverse === 'false') { $scope.myList[i].order = i; } else { $scope.myList[i].order = ($scope.myList.length - 1 - i); } } } }; function inArray(a, value) { for (var i = 0; i < a.length; i++) { if (a[i] === value) { return true; } } return false; } }); 
     #list { /* Needed, otherwise items would be at top of the page (see below) */ position: absolute; /* full width, or it would look strange */ width: 100%; } #list li { position: absolute; /* Top: 0; this will be changed for every single list item by AngularJS */ top: 0; /* Item height; hold this in sync with template file */ height: 40px; /* Simple transition */ -webkit-transition: top 0.5s ease-in-out; -moz-transition: top 0.5s ease-in-out; transition: top 0.5s ease-in-out; } 
      

    Animate Order












    • {{$index}} - {{item.order}}. {{item.text}}
  • Я расширил ответ AndreM96, чтобы отобразить список в виде сетки.

     angular.module('StackApp', []).config(function($routeProvider) { 'use strict'; $routeProvider .when('/', { template: '

    Animate Order

    ' + '
    ' + '' + '

    ' + '' + '

    ' + '' + '
    ' + '
    ' + '' + '

    ' + '
      ' + '
    • {{$index}} - {{item.order}}. {{item.text}}
    • ' + '
    ', controller: 'MainCtrl' }) .otherwise({ redirectTo: '/' }); }); angular.module('StackApp').controller('MainCtrl', function($scope) { 'use strict'; $scope.order = 'false'; $scope.myList = [{ id: 0, text: 'HTML5 Boilerplate' }, { id: 1, text: 'AngularJS' }, { id: 2, text: 'Karma' }, { id: 3, text: 'Hello' }, { id: 4, text: 'World' }, { id: 5, text: 'How' }, { id: 6, text: 'Are' }, { id: 7, text: 'You' }, { id: 8, text: '?' }, { id: 9, text: 'I' }, { id: 10, text: 'write' }, { id: 11, text: 'more' }, { id: 12, text: 'to' }, { id: 13, text: 'make' }, { id: 14, text: 'the' }, { id: 15, text: 'list' }, { id: 16, text: 'longer' } ]; $scope.$watch('order', function() { $scope.setOrder(); }); $scope.setOrder = function() { var i; if ($scope.order === 'random') { var t = []; for (i = 0; i < $scope.myList.length; i++) { var r = Math.floor(Math.random() * $scope.myList.length); while (inArray(t, r)) { r = Math.floor(Math.random() * $scope.myList.length); } t.push(r); $scope.myList[i].order = r; } } else if ($scope.order === 'false') { for (i = 0; i < $scope.myList.length; i++) { $scope.myList[i].order = i; } } else { for (i = 0; i < $scope.myList.length; i++) { $scope.myList[i].order = ($scope.myList.length - 1 - i); } } calcGridPosition(); }; function inArray(a, value) { for (var i = 0; i < a.length; i++) { if (a[i] === value) { return true; } } return false; } function calcGridPosition() { for (var i = 0; i < $scope.myList.length; i++) { var item = $scope.myList[i]; // columns, left-to-right, top-to-bottom var columns = 5; item.column = item.order % columns; item.row = Math.floor(item.order / columns); // rows, top-to-bottom, left-to-right // var rows = 3; // item.column = Math.floor(item.order/rows); // item.row = item.order%rows; } } });
     #list { position: absolute; width: 100%; list-style-type: none; padding-left: 0; } #list li { position: absolute; height: 70px; width: 70px; background: #ddd; -webkit-transition: all 2.5s ease-in-out; -moz-transition: all 2.5s ease-in-out; transition: all 2.5s ease-in-out; } 
      
  • Что такое `priority` директивы ng-repeat, можете ли вы его изменить?
  • Использование ng-if внутри ng-repeat?
  • Как сделать ng-repeat фильтровать повторяющиеся результаты
  • AngularJs Удалите повторяющиеся элементы в ng-repeat
  • Вычисление суммы повторяющихся элементов в AngularJS ng-repeat
  • Как использовать ng-repeat для словарей в AngularJs?
  • Фильтрация углового 1.2 ng-repeat с помощью «track by» с помощью булевого свойства
  • Выделение отфильтрованного результата в AngularJS
  • Сложность с ng-моделью, ng-repeat и входами
  • Ng-click не работает внутри ng-repeat
  • Использование запятой в качестве разделителя списков с помощью AngularJS
  • Давайте будем гением компьютера.