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
}
};