我现在有两种观点。
现在我登录并将我的路径更改为/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("/");
}
});
});
答案 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
,然后采取相应行动。