在$ routeChangeStart位置找不到相应的模板

时间:2015-03-30 08:40:15

标签: javascript angularjs angularjs-routing

我有一个Web应用程序和一个app变量,其中包含模块myApp 我有3个页面:/login/registration/。我的$routeChangeStart定义如下:

  1. 检查是否定义了全局变量user,如果是,请转到步骤4
  2. 检查用户想要去的地方:如果他不想进入/login/registration进行event.preventDefault()并检查是否有有效会话(通过cookie)并尝试授权用户。如果用户已获得授权,请设置user全局变量并将其重定向到他想要的页面,否则将其发送到/login页面。
  3. 如果他想要在/login/registration上做任何事情(我们在没有用户变量且我想登录或注册的情况下)。
  4. 检查用户想要去的地方:如果他想进入/login/registration进行event.preventDefault()并将其重定向到主页/页面(用户)有一个有效的会话,无需再次登录)。
  5. 逻辑运行良好,直到我们点击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");一起使用。)

2 个答案:

答案 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