angular ui-router: get $state info of toState in resolve angular ui-router: get $state info of toState in resolve javascript javascript

angular ui-router: get $state info of toState in resolve


Update for Ui-Router 1.x

$provide.decorator('$state', ($delegate, $transitions) => {    $transitions.onStart({}, (trans) => {      $delegate.toParams = trans.params()      $delegate.next = trans.to().name    })    return $delegate  })

Ui-Router 0.x

You can always decorate $state with next and toParams properties:

angular.config(function($provide) {  $provide.decorator('$state', function($delegate, $rootScope) {    $rootScope.$on('$stateChangeStart', function(event, state, params) {      $delegate.next = state;      $delegate.toParams = params;    });    return $delegate;  });});

And use as such:

.state('myState', {    url: '/something/{id}',    resolve: {        oneThing: function($state) {            console.log($state.toParams, $state.next);        }    }});


So I discovered the answer to this myself. If you're code is behaving like mine, the $stateParams object is properly injected, but $state is an empty (or old) state object.

What worked for me was referencing this in the resolve function:

.state('myState', {    url: '/something/{id}',    templateUrl: '/myTemplate.html',    controller: function() {},    resolve: {        oneThing: function($stateParams) {            console.log($stateParams); // comes through fine            var state = this;            console.log(state); // will give you a "raw" state object        }    }})

The first log will return what you'd expect. The second log will return a "raw" (for lack of a better term) state object. So, for instance, to get the state's name, you can access, this.self.name.

I realize this isn't preferred...it would be a lot nicer if $state (or another standardized object) could provide this information for us at the resolve, but this is the best I could find.

Hope that helps...