Question
Is there a way to programmatically add states to $stateProvider after module configuration, in e.g. service ?
To add more context to this question, I have a situation where I can go with two approaches:
- try to force the reload on the state defined in the module configuration, the problem is that state has a reloadOnSearch set to false , so when I try $state.go('state.name', {new:param}, {reload:true}); nothing happens, any ideas ?
State definition
.state('index.resource.view', {
url: "/:resourceName/view?pageNumber&pageSize&orderBy&search",
templateUrl: "/resourceAdministration/views/view.html",
controller: "resourceViewCtrl",
reloadOnSearch: false,
})
- try to programmatically add states that I need to load from a service so routing can work properly. I'd rather go with the first option if possible.
Answer
See -edit- for updated information
Normally states are added to the $stateProvider
during the config phase. If
you want to add states at runtime, you'll need to keep a reference to the
$stateProvider
around.
This code is untested, but should do what you want. It creates a service
called runtimeStates
. You can inject it into runtime code and then add
states.
// config-time dependencies can be injected here at .provider() declaration
myapp.provider('runtimeStates', function runtimeStates($stateProvider) {
// runtime dependencies for the service can be injected here, at the provider.$get() function.
this.$get = function($q, $timeout, $state) { // for example
return {
addState: function(name, state) {
$stateProvider.state(name, state);
}
}
}
});
I've implemented some stuff called Future States in UI-Router Extras that take care of some of the corner cases for you like mapping urls to states that don't exist yet. Future States also shows how you can lazy load the source code for runtime-states. Take a look at the [source code](https://github.com/christopherthielen/ui-router- extras/blob/master/src/futureState.js#L165) to get a feel for what is involved.
-edit- for UI-Router 1.0+
In UI-Router 1.0, states can be registered and deregistered at runtime using
[StateRegistry.register
](https://ui-
router.github.io/ng1/docs/latest/classes/state.stateregistry.html#register)
and [StateRegistry.deregister
](https://ui-
router.github.io/ng1/docs/latest/classes/state.stateregistry.html#deregister).
To get access to the StateRegistry, inject it as
[$stateRegistry
](https://ui-
router.github.io/ng1/docs/latest/modules/injectables.html#_stateregistry), or
inject [$uiRouter
](https://ui-
router.github.io/ng1/docs/latest/modules/injectables.html#_uirouter) and
access it via [UIRouter.stateRegistry
](https://ui-
router.github.io/ng1/docs/latest/classes/core.uirouter.html#stateregistry).
UI-Router 1.0 also includes Future States out of the box which handles lazy loading of state definitions, even synchronizing by URL.