UI-Router is different than Angular\'s ngRoute. It supports everything the normal ngRoute can do as well as many extra fu
For adding resolve unconditionally to one or several states an abstract state should be used for inheritance:
$stateProvider
.state('root', {
abstract: true,
resolve: {
common: ...
},
})
.state('some', {
parent: 'root',
...
});
It is the preferred method which requires no hacking.
As for the equivalent of dynamic $route resolver in UI Router, here is a small problem. When a state is registered with state method, it is stored internally and prototypically inherited from the definition, rather than just being assigned to state storage.
Though the definition can be acquired later with $state.get('stateName'), it is not the same object as the one which is being used by the router internally. Due to how JS inheritance works, it won't make a difference if resolve object exists in the state, so new resolver properties can be added there. But if there's no $state.get('stateName').resolve, that's dead end.
The solution is to patch state method and add resolve object to all states, so resolver set can be modified later.
angular.module('ui.router.hacked', ['ui.router'])
.config(function ($stateProvider) {
var stateOriginal = $stateProvider.state;
$stateProvider.state = function (name, config) {
config.resolve = config.resolve || {};
return stateOriginal.apply(this, arguments);
}
})
angular.module('app', ['ui.router.hacked']).run(function ($state) {
var state = $state.get('some');
state.resolve.someResolver = ...;
});
As any other hack, it may have pitfalls and tends to break. Though this one is very solid and simple, it requires additional unit-testing and shouldn't be used if conventional methods could be used instead.