我有一个Web应用程序和一个app
变量,其中包含模块myApp
我有3个页面:/login
,/registration
和/
。我的$routeChangeStart
定义如下:
user
,如果是,请转到步骤4
/login
或/registration
进行event.preventDefault()
并检查是否有有效会话(通过cookie)并尝试授权用户。如果用户已获得授权,请设置user
全局变量并将其重定向到他想要的页面,否则将其发送到/login
页面。/login
或/registration
上做任何事情(我们在没有用户变量且我想登录或注册的情况下)。/login
或/registration
进行event.preventDefault()
并将其重定向到主页/
页面(用户)有一个有效的会话,无需再次登录)。逻辑运行良好,直到我们点击F5
(我知道它擦除$rootScope
,但是以额外的AJAX调用为代价,我们应该没问题),而{{1}带有效会话cookie的页面。应用程序根本不会重定向到正确的模板,页面保持空白。如果我们在网址中插入/
旁边的任何内容(例如/
),一切正常。
这是我的/blah
:
app.js
为什么(function () {
angular.module("myApp", ["controllers", "services", "directives", "ngRoute"])
.config(["$httpProvider", "$routeProvider", function ($httpProvider, $routeProvider) {
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
$routeProvider
.when("/login", {
controller: "LoginController",
templateUrl: "app/partials/login.html"
})
.when("/registration", {
controller: "RegistrationController",
templateUrl: "app/partials/registration.html"
})
.when("/", {
controller: "MainController",
templateUrl: "app/partials/home.html"
})
.otherwise("/");
}])
.run(function ($rootScope, $location, $http) {
$rootScope.$on('$routeChangeStart', function (event, next, current) {
if (!$rootScope.user) {
if (next && next.$$route && (next.$$route.originalPath !== "/login" && next.$$route.originalPath !== "/registration")) {
event.preventDefault();
$http.get("http://localhost:8080/myapp/api/user?self=true")
.success(function (data) {
$rootScope.user = data;
$location.path(next.$$route.originalPath);
})
.error(function () {
$location.path("/login");
});
}
}else{
if (next && next.$$route && (next.$$route.originalPath === "/login" || next.$$route.originalPath === "/registration")){
event.preventDefault();
$location.path("/");
}
}
});
});
angular.module("controllers", []);
angular.module("services", []);
angular.module("directives", [])
})();
AJAX调用中的$location.path(next.$$route.originalPath);
无效?请注意,如果我用例如.success()
它被正确重定向(但仍然不能与$location.path("/blah");
一起使用。)
答案 0 :(得分:3)
我认为当你调用event.preventDefault()时,angular会尝试回退到当前路径。但是,如果您是第一次进入,则当前路径未定义,因此angular将根路径(" /")作为当前路径。这样做,$ location.path试图进入角度带给你的同一个地方,最终无所事事。
所以,最后你必须做一个$ route.reload()而不是$ location.path()。
$http.get("http://localhost:8080/myapp/api/user?self=true")
.success(function (data) {
$rootScope.user = data;
if ($location.path() === next.$$route.originalPath) {
$route.reload();
} else {
$location.path(next.$$route.originalPath);
}
})
.error(function () {
$location.path("/login");
});
答案 1 :(得分:0)
$rootScope.$evalAsync(function() {
$location.path('/c');
});
这应该可以正常工作。
注意:
event.preventDefault();
只能在Angular 1.3+中运行,但您无法直接更改$ location,需要$ evalAsync