Skip to content

Instantly share code, notes, and snippets.

@deanapeterson
Last active November 25, 2016 07:33
Show Gist options
  • Save deanapeterson/b93b48fd8c258861f26b to your computer and use it in GitHub Desktop.
Save deanapeterson/b93b48fd8c258861f26b to your computer and use it in GitHub Desktop.
Adding "$stateChangeRejected" event to ui-router.
(function(){
"use strict";
/**
* Hijacks the ui-router $state.transitionTo() method to capture it's promise.
* the promise is added to the $state as $promise (may or may not be needed);
* also adds handler for rejection of the $promise.
*/
angular
.module("stm.ui.stateChangeRejected", ['ui.router'])
.config(stateChangeRejected);
function stateChangeRejected($provide){
$provide.decorator("$state", decorateTransitionTo);
decorateTransitionTo.$inject = ['$delegate', '$rootScope'];
function decorateTransitionTo($delegate, $rootScope){ //$delegate === $state
var nativeTransitionTo = $delegate.transitionTo; //transfer reference
$delegate.transitionTo = transitionToWrapper;// replace with wrapper
return $delegate;
function transitionToWrapper(){
var args = [].slice.call(arguments);
var promise = nativeTransitionTo.apply(this, args);//call original transitionTo, capture promise
promise['catch'](onStateRejection); //add handler for rejection
$delegate.$promise = promise; //add $promise to default $state object
return promise;
function onStateRejection(error){
var toState = $delegate.get(args[0]);
var toParams = args[1];
$rootScope.$broadcast("$stateChangeRejected", toState, toParams, $delegate.current, $delegate.params, error);
return error;
}
}
}
}
}());
@mr-White
Copy link

mr-White commented Nov 9, 2016

Thank you @deanapeterson ! It's an informative gist that works on v0.2.18 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment