Michael Tot Korsgaard
Michael Tot Korsgaard

Reputation: 4014

Resolve UI-Router on any state

Is there a way to have the stateprovider from ui-route in AngularJS to execute a resolve whenever any route is hitted.

I'm thinking something similar to this:

$stateProvider
        .state('signin', {
            url: "/signin",
            templateUrl: 'app/modules/signin/signin.html',
            controller: 'signinController',
            resolve: {
                reset: function (Master, Storage) {
                    Master.reset();
                    Storage.set('preventSigninLeave', true);
                }
            }
        })
        .state('menu', {
            url: "/menu",
            templateUrl: 'app/modules/menu/menu.html',
            controller: 'menuController',
            resolve: {
                config: function (Config) {
                    return Config.get()
                        .then(function(response){
                            return response;
                        })
                        .catch(function(error){
                            console.error(error);
                            return undefined;
                        });
                },
                reset: function (Master) {
                    Master.reset();
                }
            }
        })
        .state('view', {
            url: '/view/:view',
            templateUrl: 'app/view/view.html',
            controller: 'viewController',
            resolve: {
                config: function (Config) {
                    return Config.get()
                        .then(function(response){
                            return response;
                        })
                        .catch(function(error){
                            console.error(error);
                            return undefined;
                        });
                }
            }
        })
        .always({
            resolve: {
                message: function () {
                    return 'hey Bub';
                }
            }
        });

Or do I have to set the variable in every state called?

Upvotes: 0

Views: 77

Answers (1)

Alberto
Alberto

Reputation: 129

I usually do this, by using state inheritance, this way resolved properties are just "resolved" once, unless user get out from parent state. I usually create a parent abstract state called "app", and make all my states inherit from it, this way if i need to introduce one resolved property for all my states i just add it.

If renaming and updating your state tree is not possible (maybe you have several states defined), I would use angular.extend or jQuery.extend, this way you could define your "always" property as a separate object and use it on demand.

Upvotes: 1

Related Questions