Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

angular: pass data when doing a $location.path()

I have two views right now.

  • login
  • main

Right now I login and change my path to /main which works fine. When I am not logged in, and try to visit /main my web service returns "Access denied for user anonymous" which I then forward them to / which is my login view. How can I pass something so my LoginController knows they were forwarded from /main to alert them to login first?

LoginController.js

VforumJS.controller('LoginController', function($scope, $location, $routeParams, LoginModel)
{
    $scope.email        = "";
    $scope.password     = "";
    $scope.fetching     = false;
    $scope.error        = null;

    $scope.login = function()
    {
        $scope.error    = null;
        $scope.fetching = true;
        LoginModel.login($scope.email, $scope.password);
    }

    $scope.$on('LoginComplete', function(event, args)
    {
        log('login complete: ' + args.result);
        $scope.fetching = false;
        if (args.result == "success")
        {
            $location.path('/main');
        }
        else
        {
            $scope.error = args.result;
        }
    });
});

MainController.js

VforumJS.controller('MainController', function($scope, $location, $routeParams, MainModel)
{
    $scope.currentTitle     = '-1';
    $scope.presentationData = MainModel.getPresentations();

    $scope.$on('PresentationsLoaded', function(event, args)
    {
        log(args.result);
        if (args.result != "Access denied for user anonymous")
        {
            //-- Parse preso data
            $scope.presentationData = args.result;
        }
        else
        {
            //-- Need to login first, route them back to login screen
            $location.path("/");
        }
    });
});
like image 213
Ronnie Avatar asked Apr 16 '26 21:04

Ronnie


1 Answers

You can use $location.search() in your MainController to pass query string to the LoginController.

Inside you MainController:

    if (args.result != "Access denied for user anonymous")
    {
        //-- Parse preso data
        $scope.presentationData = args.result;
    }
    else
    {
        //-- Need to login first, route them back to login screen
        $location.search({ redirectFrom: $location.path() });
        $location.path("/");
    }

And then in your LoginController, shortened for brevity:

VforumJS.controller('LoginController', function($scope, $location, $routeParams, LoginModel)
{
    var queryString = $location.search();

    $scope.$on('LoginComplete', function(event, args)
    {
        log('login complete: ' + args.result);
        $scope.fetching = false;
        if (args.result == "success")
        {
            if (queryString && queryString.redirectFrom) {
                $location.path(queryString.redirectFrom);
            } else {
                $location.path('/somedefaultlocation');
            }
        }
        else
        {
            $scope.error = args.result;
        }
    });
});

Alternatively you can use a shared service, maybe even your LoginModel to set a parameter from MainController to indicate the redirect came from it.

Update Even better still, use $httpProvider.interceptors to register a response interceptor, and then use the same $location.search() technique described above to redirect to the login screen on authentication failure. This method is ideal as your controllers are then clean of authentication logic.

like image 144
Beyers Avatar answered Apr 19 '26 16:04

Beyers



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!