【发布时间】:2018-03-24 07:36:33
【问题描述】:
我的应用程序中有两个 Angular 应用程序。第一个应用程序基本上只是登录页面,第二个应用程序是其他一切。这两个应用共享几个服务,包括一个控制登录信息/逻辑的服务。
当用户使用“记住我”功能时会出现问题。我们希望他们在浏览登录页面时自动登录并重定向到登录状态页面。自动登录位工作正常,但是当我们尝试将用户重定向到第二个应用程序中的状态页面时,他们会陷入登录页面反复刷新的无限循环。 (有趣的是,如果用户没有登录,输入相应的登录信息并点击
似乎重定向有效,因为 url 确实更新正确并且页面刷新,但内容错误(仍然是旧的控制器和视图),所以它不断重新做同样的事情 - 检查是否登录,如果是则重定向。 如何确保我确实转移到第二个应用并在重定向时加载正确的视图/控制器?
代码:
twPublicApp.controller('PublicLoginCtrl', function ($scope, $http, LoginData, BrowserStorageService, $window, $location) {
window.changeApiRoot('/api/');
$scope.username = '';
$scope.password = '';
$scope.remember = false;
$scope.errorMessage = '';
$scope.authenticating = false;
if (LoginData.get('SessionToken', null, true) !== null) {
// Check if still has a valid session
$scope.authenticating = true;
LoginData.checkSession(LoginData.get('SessionToken'), LoginData.get('Location'))
.success(function(data) {
if (data.Result === true) {
console.log('User looks to be already logged in... sending on');
BrowserStorageService.changeStore('localStorage');
LoginData.set(data);
//This is the line giving me problems. I've tried these two versions, and a few others, and nothing seems to work properly.
//window.location.href = '/console#/status';
$window.location = '/console#/status';
$scope.authenticating = false;
} else {
$scope.authenticating = false;
LoginData.set({});
}
})
.error(function(jqXHR, textStatus, errorThrown) {
$scope.authenticating = false;
LoginData.set({});
});
}
$scope.authenticate = function() {
$scope.authenticating = true;
LoginData.authenticate($scope.username, $scope.password, $scope.remember)
.success(function(data) {
if (data.Result === true) {
if ($scope.remember) {
BrowserStorageService.changeStore('localStorage');
} else {
BrowserStorageService.changeStore('sessionStorage');
}
LoginData.set(data);
//Interestingly, this line works perfectly.
window.location.href = '/console#/status';
return;
}
$scope.authenticating = false;
})
.error(function(jqXHR, textStatus, errorThrown) {
$scope.authenticating = false;
});
};
});
【问题讨论】:
-
使用路由定义 URL 的状态并使用 Angular 的 $location.path("yourUrlName") 导航到状态页面。这将确保控制器值在视图中得到更新。
-
@Vivz 我试过了。问题是我想移动到第二个角度应用程序,而不是在同一个应用程序中,所以使用状态不起作用。
-
您可以尝试使用
$location.path(url)来设置网址吗?此外,如果不查看其余代码,很难找出问题所在(示例 plunker 会很好),但您可以调试以查看这是否不是由 URL 更改时对 $browser.onUrlChange() 的调用引起的。跨度> -
@SamirAguiar 我已经尝试过
$location.path(url),但这也不起作用。我不确定我是否理解你对$browser.onURLChange()的建议——你告诉我该怎么做?只是观察以确保 url 正在更改?我可以说这是因为它在地址栏中发生了变化。 -
@senschen 我实际上的意思是,作为您可以开始调试的提示...但是,如果您可以提供一个简单的 Plunker,它会更容易,因为很多其他因素可能会影响这一点。
标签: javascript angularjs redirect url-redirection