我实现了一个有角度的页面范围authentication app。
它是一个使用拦截器的事件机器,因此如果任何请求导致401响应,它会弹出一个登录模式。当登录成功时,它会再次执行请求(如果记录的用户没有足够的权限访问请求的资源,也可能导致403)。
很长时间,事情正在按预期工作,除了当用户取消登录过程时,$location.path()
仍然指向所请求的资源。我想将其恢复到上一个路径。所以:
我希望能够得到#34; callee"像这样的网址:
.factory('authInterceptor', ...
return {
// Append the authentication headers to every request
request: function(config) {
previousLocation = $location.path(); // <--- HERE
if(Session.exist) {
config.headers.Authorization = Session.token;
}
return config || $q.when(config);
},
我希望这条线给我&#34; callee&#34;路径,但它实际上给了我一个请求的(角度在执行请求之前已经改变了它)。
.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/admin', {
templateUrl: "/admin"
})
.otherwise({ redirectTo: '/' });
}])
这个顽皮的小男孩正在改变我的路径。我想我可以在这里解决一些问题,但我发现这没有用,因为它会彻底破坏封装,迫使我每次调用任何受保护资源时都要解决,所以我可以将当前路径传递给某些服务在我的身份验证应用程序中。
那么,如何从拦截器或auth应用程序中的某些服务获取以前的路径,而无需从路由提供程序配置中明确发送它?
答案 0 :(得分:2)
为什么不观看$on
路由更改事件并将当前/以前的路径绑定到$window
或全局$scope
变量?
我上面没有阅读您的所有代码,但这就是我在应用中处理位置内容的方式:
$scope.$on('$routeChangeSuccess', function(evt, current, previous){
var routeData = {};
//prop: uriSegment
//desc: get all uri segments for current location
routeData.uriSegment = [];
routeData.uriSegment = $location.path().substr(1).split('/');
//prop: urls
//desc: get current & previous urls
routeData.urls = {};
routeData.urls.curr = $location.url().substr(1);
//...previous url
if(previous && previous.originalPath){
//remove matching structure & slashes from url & add params as plain values
var prevUrl = previous.originalPath.substr(1).replace('/:', '/').replace(':', '');
if(previous.pathParams){
angular.forEach(previous.pathParams, function(val, key){
prevUrl = prevUrl.replace(key, val);
});
}
routeData.urls.prev = prevUrl;
}
//bind routeData to scope/window...
$scope.uriSegment = routeData.uriSegment;
$scope.urls = routeData.urls;
});
它是如何运作的:
<强> 1。得到最新的&amp;上一个网址:
$scope.urls.curr //shows current url
$scope.urls.prev //shows previous url
...如果您的路由定义为/admin/:userID
并且您在该页面上,则该网址将包含该特定用户ID,它将不会返回该参数名称。 /admin/53
将为/admin/53
。
<强> 2。从当前网址获取特定网址:
$scope.uriSegment[1]
...对于/admin/53
这样的当前网址,将打印53
上面的代码中有很多东西,但我认为这就是你需要的东西 - 记住以前的代码。您可以玩路线活动并建立自己的活动
我看到您在工厂中注入$routeScope
,因此您可以在主控制器中添加我的代码,并在每次路由更改时使用$routeScope
更新routeData
,然后您可以这样:
...
previousLocation = $rootScope.urls.prev;
...
有关路线事件的更多信息here。