当前位置: 首页 > 面试题库 >

如何使用ng-repeat和ng-animate来对orderBy的列表进行动画处理?

宰父涵忍
2023-03-14
问题内容

我正在使用像这样ng-repeatorderBy过滤器渲染对象列表:

<li class="list-item" ng-repeat="item in items | orderBy:predicate:reverse">

我尝试对列表的排序进行ng动画处理的尝试令人沮丧,因此不值得分享。我在这里看到了Yearofmoo示例应用程序。

不幸的是,这个演示并不是我想要实现的。在orderBy定义更改后,当给定列表项以新顺序放置时,我需要设置其X位置的动画。我试图通过css过渡和绝对定位来实现这一点,但是ng- repeat似乎在orderBy使动画成为真正的挑战时重新创建了列表项。

  1. 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;

}


<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>

<div ng-app="StackApp">

  <div ng-controller="MainCtrl">

    <h1>Animate Order</h1>

    <form action="">

      <label for="reverse">reverse = true</label>

      <br>

      <input type="radio" value="true" name="reverse" ng-model="reverse">

      <br>

      <br>

      <label for="reverse">reverse = false</label>

      <br>

      <input type="radio" value="false" name="reverse" ng-model="reverse">

      <br>

      <br>

      <label for="reverse">reverse = random (click button below to shuffle again)</label>

      <br>

      <input type="radio" value="random" name="reverse" ng-model="reverse">

    </form>

    <br>

    <br>

    <input type="button" ng-click="reverse = 'random';setOrder()" value="setOrder()">

    <br>

    <br>

    <ul id="list" ng-style="{height: ((myList.length * 40) + 'px')}">

      <li ng-repeat="item in myList" ng-style="{top: ((item.order * 40) + 'px')}">{{$index}} - {{item.order}}. {{item.text}}</li>

    </ul>

  </div>

</div>

因此,AngularJS不会对项目进行排序,但是会更改CSS属性topng-style="{top: ...}")。AngularJS不会重新创建列表,我们得到了一个不错的动画。:)



 类似资料:
  • 问题内容: 我正在尝试将模型中的数据插入模板,但是我想每7次重复添加一个新的表行。使用基于strign的模板,我可以使用迭代索引和模来相当容易地做到这一点,但是我无法弄清楚如何使用angular的DOM模板来做到这一点。 这是HTML: 而javascript类似于: 您可以在JSFiddle中查看以下代码:http : //jsfiddle.net/3zhbB/2/ 问题答案: 请与天数组的数组

  • 问题内容: 我正在尝试创建一个应用程序,用户可以选择不同类型的块并将它们堆叠在一起以创建唯一的模板。 由于我希望用户能够多次将相同的块添加到模板中,因此我必须使用“ track by $ index”来完成此操作: 但是,当我尝试使用ng- animate添加动画时,用于删除块的动画是在模板中的最后一块而不是remove块上进行动画处理。我将代码放在jsfiddle的http://jsfiddle

  • 问题内容: 我正在使用AngularJS,并且假设它可以工作(不起作用),我想获得的效果将类似于它将产生的效果。 视图 控制者 我意识到该代码将无法使用,因为它不可用,因为它将仅可用于每一行内的对象。该代码是为了让我了解正在尝试做的事情:即。我希望能够使用其类也基于条件的表行来创建,该条件取决于对行本身的范围功能的访问。。我意识到我 可以 在列上添加ng- class,但这很无聊。有人有更好的主意

  • 问题内容: 我已经创建了jsfiddle http://jsfiddle.net/99vtukjk/ 在单击左或右文本时,当前用于隐藏的动画是向上的,我们如何才能将其更改为向左滑动动画,例如向左菜单栏滑动并淡入淡出? CSS: 角度模块 问题答案: 您可以设置在 和上 这是一个工作的小提琴 可以帮助您制作精美动画的一件事是使用 Animate.css animate.css是一堆很棒,有趣且跨浏览

  • 问题内容: 我正在尝试将AngularJS用于我的第一个项目(锦标赛经理),并且筛选器不起作用:(我已阅读了有关该文档的所有文档,但无济于事:/ 所以,我在上面定义了vars : 现在,在我看来,我正在尝试重新排序(首先只有一个订单项),但是再也无法工作… 第二次,我要重新排序,从2条信息:和如果第一是平等的。我尝试更换这样的,但如果一个代码没有工作,他绝不会与2工作… 谢谢大家的阅读,对于帖子的

  • �� ng-animate ng-animate is a collection of cool, reusable and flexible animations for Angular. It implements all the animations in animate.css, but with the power and flexibility of Angular animation