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>