Javascript AngularJS$location.path未重定向

Javascript AngularJS$location.path未重定向,javascript,angularjs,Javascript,Angularjs,我一直在寻找解决方案,但仍然无法使$location.path()正常工作 情况很简单:经过肯定身份验证后,我将尝试返回根地址:/#/。地址栏中的路径正在更改,但页面没有更改。奇怪的是,当我在地址栏中按“回车”键时,页面会在转到根地址之前重新加载。更奇怪的是,在它将我重定向到另一个页面之前,我必须多次按enter键。这很奇怪,因为这不是“一页”方法的工作原理 我正在使用Angular Router,页面的其余部分工作正常。在输入路径并按“回车”键后,每个屏幕都能顺利加载-无需重新加载。唯一的问题

我一直在寻找解决方案,但仍然无法使
$location.path()
正常工作

情况很简单:经过肯定身份验证后,我将尝试返回根地址:
/#/
。地址栏中的路径正在更改,但页面没有更改。奇怪的是,当我在地址栏中按“回车”键时,页面会在转到根地址之前重新加载。更奇怪的是,在它将我重定向到另一个页面之前,我必须多次按enter键。这很奇怪,因为这不是“一页”方法的工作原理

我正在使用Angular Router,页面的其余部分工作正常。在输入路径并按“回车”键后,每个屏幕都能顺利加载-无需重新加载。唯一的问题是身份验证步骤

首次加载应用程序时,由于未保存身份验证详细信息,因此会发出
/login
页面,该应用程序可以在肯定身份验证后重定向到根地址(但并不总是如此)。但是,当应用程序运行时,身份验证详细信息丢失,并且用户被重定向到
/login
页面时,应用程序就无法返回到根URL

我创建了一个流程图,它显示了路线是如何变化的。当用户打开应用程序且尚未登录时,绿色区域显示第一种情况。当用户由于某种原因(例如旧令牌、从其他来源更改的密码)丢失身份验证详细信息时,读取区域显示第二种情况。用户被重定向到
/login
页面,然后经过肯定身份验证后,无法返回到根URL

我试图将
$location.path('/')
包装到
$scope.$apply
中,但收到一个错误,即摘要实际上正在进行中。将其包装在
$timeout
中也没有帮助。我当然可以在更改路径后重新加载页面,但这会造成界面消失的丑陋效果

以下是按下“登录”按钮后触发的代码

路线:

$routeProvider
    .when('/login', {
        templateUrl: 'views/login.html',
        controller: 'LoginController',
        controllerAs: 'vm'
    })
    .when('/', {
        templateUrl: 'views/home.html',
        controller: 'HomeController',
        controllerAs: 'vm',
        resolve: {
            init: init
        }
    });

/* @ngInject */
function init(ConfigService, TemperatureService) {
var ret = {};

return ConfigService.finished()
    .then(function () {
        return TemperatureService.getSetPoint();
    })
    .then(function (data) {
        ret['setpoint'] = data;
        return TemperatureService.getWorkModes();
    })
    .then(function (data) {
        ret['workmodes'] = data;
        return ret;
    });
}

这看起来像是
location.path
方法的一种奇怪行为。或者我只是错过了什么。非常感谢您的帮助。

这可能是由于路由
/
的解析功能
init
未正确解析造成的

您可以尝试收听
$routeChangeError
事件,查看出现了什么问题

$rootScope.$on('$routeChangeError', function () {
  ...
});

在您的问题中,您使用了一个
resolve
,它执行该resolve函数中给出的代码

您用于解析的
init
函数中一定有问题

$routeProvider
    .when('/login', {
        templateUrl: 'views/login.html',
        controller: 'LoginController',
        controllerAs: 'vm'
    })
    .when('/', {
        templateUrl: 'views/home.html',
        controller: 'HomeController',
        controllerAs: 'vm',
        resolve: {
            init: init
        }
    });
你的init可以到这里

var init = function ($q, $rootScope, $location) {
    if ($rootScope.login) {
        return true;
    } else {
        $location.path('/login')  // this is a sample
    }
};

这种方法可能有一些问题。请检查一次。

您在Resolve中有什么可以显示用户最初登录的重定向?替换
$location.path('/')
$location.url('/')并检查。@Sravan两个字:1.谢谢2.谢谢!你是我的编程鸭子。结果是,我在
init
中的一个承诺没有得到正确的解决,那就是阻止了路由更改。写下答案,我会接受它作为解决方案。@itachi,作为答案补充。
var init = function ($q, $rootScope, $location) {
    if ($rootScope.login) {
        return true;
    } else {
        $location.path('/login')  // this is a sample
    }
};