I'm using $stateChangeStart with ui-router as a means of setting which direction a ui-view transition should go. I have a state history array and if the toState is the last state visited then I slide the view right instead of left so it looks like you are going "back" to the view, nothing too crazy.
The original problem I had was that the ng-class wouldn't set properly on the current view, only the incoming view, so the current view wouldn't slide right off the screen. I slowed down the transition and in the chrome console saw that in fact the class was not being set to slide-right.
It started to work perfectly when I added $scope.$apply(). When I make a transition using ui-sref I don't see any errors in the console. But when I used back/forward I get the $digest already in progress error.
What's the difference between how the back/fwd buttons and ui-sref trigger a state change that would cause the error? Appreciate any insight!
The controller:
.controller('PublicController', function ($rootScope, $scope, $location, $anchorScroll) {
$scope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams, error) {
var hist = $scope.$parent.model.stateHistory;
if (hist.length && hist[0].name === toState.name) {
$scope.$parent.model.slideDirection = 'right';
$scope.$apply();
hist.shift();
}
else {
$scope.$parent.model.slideDirection = 'left';
$scope.$apply();
hist.unshift(fromState);
}
$location.hash('');
$anchorScroll();
});
})
The view:
<div class="main-public-view" ui-view="main.public"
ng-class="{
'slide-left' : model.slideDirection === 'left',
'slide-right' : model.slideDirection === 'right'
}"></div>