Taerus
Taerus

Reputation: 475

AngularUI Router not redirecting in resolve

Can anyone explain to me why, in the following code, $state.go AND $location.path() both do not work?

state

.state('sheet', {
        url: "/",
        templateUrl: "views/sheet.html",
        controller: 'SheetCtrl',
        resolve:
        {
            loginRequired:
                function(RequireLoginService) {
                    return RequireLoginService.loginRequired();
                }
        }
    })

RequireLoginService

.service('RequireLoginService', function (event, $state, $q, UserService) {
    return {
        loginRequired: function () {
            var deferred = $q.defer();

            if (!UserService.isLogged) {
                event.preventDefault();
                $state.go('login');      // or $location.path('/login');
                deferred.reject();
            } else {
                deferred.resolve()
            }

            return deferred.promise;
        }
    }
  });

Upvotes: 1

Views: 83

Answers (1)

Olatunde Garuba
Olatunde Garuba

Reputation: 1069

You need to notify angulajs of the changes by using an $timeout without resulting to a "$digest already in progress".

.service('RequireLoginService', function (event, $state, $timeout, $q, UserService) {
return {
    loginRequired: function () {
        var deferred = $q.defer();

        if (!UserService.isLogged) {
            event.preventDefault();
            $timeout(function(){
              $state.go('login');      // or $location.path('/login');
            });
            deferred.reject();
        } else {
            deferred.resolve()
        }

        return deferred.promise;
    }
  }
});

I'm glad it solves the issue.

Upvotes: 2

Related Questions