我使用AngularJS开发SPA。我的配置如下所示:
app.config(["$routeProvider",
function($routeProvider) {
return $routeProvider
.when("/", {
redirectTo: "/clients"
}).when("/clients", {
templateUrl: "app/views/crm/clients/list.html"
}).when("/client/:id?", {
templateUrl: "app/views/crm/clients/edit.html"
}).when("/404", {
templateUrl: "app/views/pages/404.html"
}).otherwise({
redirectTo: "/404"
});
}
]);
我想让我的用户共享客户端的网址:http://myapp.com/#/client/1
,http://myapp.com/#/client/2
等。我们的想法是用户将URL写入位置栏并转到特定客户端的客户端页面。
当我尝试收听$routeChangeStart
事件时,我发现第一次加载页面时事件回调中的current
参数为空,而next.$$route.originalPath
始终为/
$rootScope.$on('$routeChangeStart', function(event, next, current) {
console.log(current); // undefined
console.log(next.$$route.originalPath); // /
console.log(next.$$route.redirectTo); // /clients
});
那么如何才能将原始URL发送到服务器以使用请求的路由?
更新
事实证明,问题出在我自己的重定向中,这是在提取cookie的用户会话令牌时触发的。它会重定向到/
每个使用会话cookie输入应用程序的用户。
答案 0 :(得分:1)
您可以使用
document.URL
或
$window.location
即:
$rootScope.$on('$routeChangeStart', function(event, next, current) {
console.log(document.URL);
console.log($window.location)
});
请在此处查看演示 http://plnkr.co/edit/oaW40vWewxdZYxRkCW8c?p=preview
答案 1 :(得分:0)
最后,我想出了一个看似脏黑客的解决方案。
var app = angular.module('app', [ ... ]);
app.run(function (...) {
...
var firstTimeLocationChanged = true;
$rootScope.$on('$locationChangeStart', function(event, next, current) {
var savedPath = current.split('#').slice(-1);
if (firstTimeLocationChanged && ['/', '/login'].indexOf(savedPath) < 0) {
firstTimeLocationChanged = false;
setTimeout(function() {
console.log('redirect to: ' + savedPath);
$location.path(savedPath);
}, 3000);
}
});
...
});
<强>更新强>
事实证明,问题出在我自己的重定向中,这是在提取cookie的用户会话令牌时触发的。它会重定向到/
每个使用会话cookie输入应用程序的用户。所以根本不需要上面的解决方案。