I have the following case: I'm using the ui-router for the routing in my AngularJS application. In one route, there are five child states for different subscreens. I want to animate the transition between these in a carousel-like manner.
The navigation looks like this:
Link to A | Link to B | Link to C | Link to D | Link to E
Navigating from state A to state B should make screen A slide out to the left and screen B slide in from the right; vice versa for navigating from state B to state A.
What does work is animating the screen transitions with transform: translateX(...); on enter and leave in one direction only.
Usually, I control my animations using ng-class with a flag. In this case, however, setting a class on the ui-view element doesn't work at all (Angular 1.2 and ui-router 0.2 aren't completely compatible yet). Neither is it working with setting it with a custom directive listening to scope.$on "$stateChangeStart" which is fired after the transition has begun.
How can I implement the desired behavior?
Edit: The solution
For the record: I ended up implementing it using a custom $scope function using $state.go() to determine the direction before changing the route. This avoids the $digest already in progress errors. The class determining the animation is added to the ui-view's parent element; this animates both the current as well as the future ui-view in the correct direction.
Controller function (Coffeescript):
go: (entry) ->
  fromIdx = ...
  toIdx = ...
  if fromIdx > toIdx
    $scope.back = false
  else
    $scope.back = true
  $state.go entry
Template:
<div ng-class="{toLeft: back}">
  <div ui-view></div>
</div>
 
     
     
     
     
    