路线变化的两种不同动画

Sam*_* S. 21 angularjs angularjs-animation angular-ui-router

我有以下情况:我在我的AngularJS应用程序中使用ui-router进行路由.在一个路线中,有五种子状态用于不同的子屏幕.我希望以类似旋转木马的方式为它们之间的过渡制作动画.

导航如下所示:

Link to A | Link to B | Link to C | Link to D | Link to E
Run Code Online (Sandbox Code Playgroud)

从导航state Astate B应该screen A滑出左,screen B从右边滑动; 反之亦然导航state Bstate A.

什么工作是与所述屏幕转换transform: translateX(...);enter,并leave一个唯一的方向.

通常,我使用ng-class旗帜控制我的动画.但是,在这种情况下,在ui-view元素上设置类根本不起作用(Angular 1.2和ui-router 0.2还不完全兼容).也没有使用自定义指令设置它,scope.$on "$stateChangeStart"在转换开始后触发该指令.

我该如何实现所需的行为?

编辑:解决方案

为了记录:我最终使用自定义$scope函数实现它$state.go(),用于在更改路径之前确定方向.这可以避免$digest already in progress错误.确定动画的类被添加到ui-view父元素中; 这样可以ui-view在正确的方向上激活当前和未来.

控制器功能(Coffeescript):

go: (entry) ->
  fromIdx = ...
  toIdx = ...

  if fromIdx > toIdx
    $scope.back = false
  else
    $scope.back = true

  $state.go entry
Run Code Online (Sandbox Code Playgroud)

模板:

<div ng-class="{toLeft: back}">
  <div ui-view></div>
</div>
Run Code Online (Sandbox Code Playgroud)

edd*_*iec 26

您可以通过设置控制器来专门执行此操作来控制视图中的类.然后,您可以订阅应用程序中的事件并更改页面动画的方式.

<div class="viewWrap" ng-controller="viewCtrl">
  <div class="container" ui-view ng-class="{back: back}"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器内

.controller('viewCtrl', function ($scope) {
    $scope.$on('$stateChangeSuccess', function (event, toState) {
        if (toState.name === 'state1') {
            $scope.back = true; 
        } else {
            $scope.back = false; 
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

我已经设置了一个codepen来演示http://codepen.io/ed_conolly/pen/aubKf

对于任何想要这样做的人请注意,由于Angular 1.2和UI路由器中动画的当前不兼容性,我必须使用ui.router.compat模块.