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...