Javascript 角度重定向不起作用

Javascript 角度重定向不起作用,javascript,angularjs,Javascript,Angularjs,我确信这个问题已经被回答了一千次,但我不明白为什么我只能在搜索数小时后使用window.location.href重定向。发生什么事了 angular.module(..., []) .config([..., function(...) { /* Route Provider and ngRoute reference removed as per comment below */ $stateProvider .state('logi

我确信这个问题已经被回答了一千次,但我不明白为什么我只能在搜索数小时后使用
window.location.href
重定向。发生什么事了

angular.module(..., [])
.config([..., function(...) {
        /* Route Provider and ngRoute reference removed as per comment below */
         $stateProvider
            .state('login', {
                url : '/login',
                controller: 'loginCtrl',
                templateUrl: '/login'
            })

            .state('home', {
                url: '/',
                templateUrl: '/views/index',
                controller: 'HomeCtrl'

            });
        $locationProvider.html5Mode(true);
    }
])
   .run(['$state',  '$rootScope', function ($state, $rootScope) {
    $rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) {
            if ($rootScope.username == null || $rootScope.password == null) {
                if (toState.templateUrl == "/login") {

                } else {
                        event.preventDefault();
                        $state.go("login");

                }
            }
        });
    }
]);
更新:StateChangeStart被调用两次,第二次使用登录状态。控制台中没有抛出错误。我是个新手,所以如果我做错了什么,我愿意接受任何建议。如果您需要任何附加代码(例如:控制器、服务),请告诉我,我会发布它

但是,在显示欢迎页面时,即使用户名和密码为空,它仍保留在欢迎页面上。在浏览器中输入
/login
,工作正常

根据:

给我一个错误:
$摘要已在进行中

更多详细信息: 我刚刚发现,如果我删除
$locationProvider.html5Mode(true)行,
加载页面时未调用stateChangeStart。
服务器是ASP.Net

编辑2
看起来angular实际上正在获取登录页面,但不知道将其放置在何处?

在angular use的run函数中:

$rootScope.$on('$stateChangeStart', function (event, toState) {
    if (toState.name != 'login') {
        $state.go('login');
        event.preventDefault();
    }
});
仅使用stateProvider设置路由

按照这里的指导

或者在apache上:


为了正确设置节点上angular js的html5 pushstate(如果您在服务器上使用的是该状态)

在angular use的run函数中:

$rootScope.$on('$stateChangeStart', function (event, toState) {
    if (toState.name != 'login') {
        $state.go('login');
        event.preventDefault();
    }
});
仅使用stateProvider设置路由

按照这里的指导

或者在apache上:



为了正确地为节点上的angular js设置html5 pushstate(如果这是您在服务器上使用的)

并阅读我为身份验证问题编写的内容,您或多或少会发现一些有用的内容。

并阅读我为身份验证问题编写的内容,或多或少你会发现一些有用的东西。

我很确定你把Angular的原生
ngRoute
UI路由器
模块混在一起了。放置event.preventDefault();在重定向之后,使用$state.go('login')并删除$location.path('login')@所以你的意思是
$rootScope.$apply(function(){$state.go(“login”);event.preventDefault();})?似乎也没有任何效果-停留在主页上没有错误。我很确定您混淆了Angular的原生
ngRoute
UI路由器
模块。放置事件.preventDefault();在重定向之后,使用$state.go('login')并删除$location.path('login')@所以你的意思是
$rootScope.$apply(function(){$state.go(“login”);event.preventDefault();})?似乎也没有任何效果-停留在主页上没有错误。它不起作用。看看这个屏幕盖:尝试只使用状态提供程序。我不认为它的设计是为了和side routeprovider一起工作。我现在已经尝试过了。实际上,让我来更新代码。它不起作用。看看这个屏幕盖:尝试只使用状态提供程序。我不认为它是设计用于side routeprovider的。我只是尝试了一下,现在让我来更新代码。我可以建议你的第一件事是删除$locationProvider.html5Mode(true),如果你没有.htaccess(如果你在linux中),这个可能会有问题。这是一个非常好的观点,david您是否有支持html5模式的服务器端实现?您需要为html5 pushState to work属性设置重定向。这不仅仅是客户端的事情。阅读本文,在Linux@MatteoGabriele上使用.htaccess文件设置一个更好的环境如果我删除locationProvider行,则永远不会调用stateChangeStart。我可以建议您的第一件事是,如果您没有.htaccess(如果您在Linux中),请删除$locationProvider.html5Mode(true)这可能会有问题。这是一个很好的观点,david,您是否有支持html5模式的服务器端实现?您需要为html5 pushState to work属性设置重定向。这不仅仅是客户端的事情。阅读本文,在Linux@MatteoGabriele上使用.htaccess文件设置一个更好的环境如果我删除locationProvider行,stateChangeStart永远不会被调用。