angular:在执行$ location.path()时传递数据

时间:2014-01-08 19:45:41

标签: javascript angularjs

我现在有两种观点。

  • 登录

现在我登录并将我的路径更改为/main,其工作正常。当我未登录并尝试访问/main时,我的网络服务会返回"Access denied for user anonymous",然后我将其转发到/这是我的登录视图。我如何传递某些内容,以便LoginController知道他们是从/main转发来提醒他们先登录?

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("/");
        }
    });
});

2 个答案:

答案 0 :(得分:3)

您可以使用$location.search()中的MainController将查询字符串传递给LoginController

在你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("/");
    }

然后在你的LoginController中,为简洁而缩短:

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;
        }
    });
});

或者你可以使用共享服务,甚至可以使用LoginModel来设置MainController中的参数,以指示重定向来自它。

<强>更新 更好的是,使用$httpProvider.interceptors注册响应拦截器,然后使用上述相同的$location.search()技术在身份验证失败时重定向到登录屏幕。这种方法非常理想,因为您的控制器可以清除身份验证逻辑。

答案 1 :(得分:0)

$location广播$locationChangeStart$locationChangeSuccess个事件,每个事件的第三个参数为oldUrl

一种解决方案是拥有订阅$locationChangeStart的服务,以便保存当前和旧网址。

当您点击/时,您的LoginController可以检查您的服务,看看oldUrl是否为/main,然后采取相应行动。