【问题标题】:ng-repeat animation complete callbackng-repeat 动画完成回调
【发布时间】:2014-12-28 23:07:58
【问题描述】:

所以我有一个简单的 ng-repeat,其中包含在 javascript 中定义的输入动画。

沙盒:http://codepen.io/anri82/pen/KwgGeY

代码:

<div ng-app="myApp" ng-controller="MyController">
  {{state}}
  <ul>
     <li class="repeat-animate" ng-repeat="item in list">{{item}}</li>
  </ul>
  <button ng-click="add()">add</button>
</div>

angular.module('myApp', ['ngAnimate'])
.controller("MyController", function($scope) { 
   $scope.state ="idle";
   $scope.id=3;
   $scope.list = [1,2];
   $scope.add = function () {
     $scope.state="pushing";
     $scope.list.push($scope.id++);
     $scope.state="done pushing";
   }; 
}).animation('.repeat-animate', function () {
  return {
    enter: function (element, done) {
      element.hide().show(2000, done);
    }
  };
});

只有在动画完成后,我如何将$scope.state 切换到done pushing?答案应该是有角度的,不要建议setTimeout

【问题讨论】:

    标签: javascript angularjs ng-animate


    【解决方案1】:

    使用您正在执行的 javascript 动画方法,您需要在动画的 done 回调中掌握当前元素的范围。由于更新变量后它在角度上下文之外,您需要通过执行$scope.$apply()(或使用$timeoutscope.$evalAsync 等)手动调用摘要循环。而且由于 ng-repeat 创建了一个子作用域,元素的作用域实际上将具有从父控制器作用域继承的属性 state,因此为了使更新反映在父作用域上,请使用一个对象来包装 @987654327 @ 属性,这样子作用域和父作用域具有相同的对象引用。

    angular.module('myApp', ['ngAnimate'])
    .controller("MyController", function($scope) { 
      $scope.push = {state: "idle" }; 
      $scope.id=3;
      $scope.list = [1,2];
      $scope.add = function () {
        $scope.push.state="pushing";
        $scope.list.push($scope.id++);
    
      }; 
    }).animation('.repeat-animate', function () {
      return {
        enter: function (element, done) {
         element.hide().show(2000, function(){
              var scope = element.scope(); //Get the scope
              scope.$evalAsync(function(){ //Push it to async queue
                 scope.push.state="done pushing"
              }); 
          });
        }
      };
    });
    

    Demo

    【讨论】:

    • $evalAsync 应该带一个字符串,不是吗?现在您的代码执行分配并将"done pushing" 传递给scope.$evalAsync,这与执行scope.push.state="done pushing"; scope.$evalAsync(); 没有什么不同
    • @FabrícioMatté 当然没有区别,它只是写在一行中,it can take any expression。在这里没关系
    • 哦,我明白了,如果分成两行,它的意图会更清楚。我的意思是,$evalAsync 可选地接受一个表达式,并且您的代码具有将 "done pushing" 作为要评估的(无效)角度表达式传递的副作用,这会在控制台中引发错误。
    • @FabrícioMatté 我同意,我已经更新,因为它更具可读性,并且没有 invalid 角度表达式,但它只会尝试评估范围内的属性不存在。
    • 当然,既然您已经更新了代码,那么这个错误并不重要。 ;)
    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多