从一个AngularJS应用切换到另一个 - 页面内容不更新
我有两个角应用作为我的应用的一部分。第一个应用程序基本上只是登录页面,第二个应用程序是其他所有内容。这两个应用共享一些服务,包括控制登录信息/逻辑的服务。从一个AngularJS应用切换到另一个 - 页面内容不更新
当用户使用“记住我”功能时会出现此问题。我们希望它们在浏览到登录页面并被重定向到登录状态页面时自动登录。自动登录位工作正常,但是当我们尝试将用户重定向到第二个应用程序中的状态页时,他们会陷入无限循环,登录页面一遍又一遍地刷新。 (有趣的是,如果用户没有登录,输入正确的登录信息并点击
似乎重定向的工作,因为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;
});
};
});
Using $window or $location to Redirect in AngularJS
我相信上面提到的链接可以帮助你解决你的问题。
我看到了这个问题,它的解决方案对我来说并不适用。我认为这个问题与不得不在两个角度应用程序之间切换有关。 – senschen
有猜测
尝试使用$窗口或窗口,而不是两个。
if (LoginData.get('SessionToken', null, true) !== null)
块可能运行得太快。尝试将它放在$超时块中,看看它是否有所不同。
我正在使用其中之一,我只是让它们都在代码示例中,以防止显而易见的“使用$窗口”答案。另外,我试图说,如果在超时内阻止,它并没有解决问题。 – senschen
看来你的LoginController应用是好的,但在用户被重定向到其他页面所有你喜欢指定的值“认证”并不只是会话存储保持同样存在。我不知道你是如何验证用户的登录检查,如果它基于任何这些标志,因为你的这段代码是好的你。请记住,每当你改变/重定向到其他网站时,每一件事都会被重新引导。要么共享其他应用程序基本代码,要么确保会话数据(或者您如何进行身份验证)基于相同的数据。
我想首先指出你处理事物的方式不可取。无论一个项目通过一个根应用程序处理它有多复杂,从长远来看都更容易。
现在针对您的问题的具体答案。
检查$locationProvider
中的东西,以便没有闪烁等,然后将它们重定向到处理第二个应用程序的视图的页面。
$window.open('root_page_second_app.html', '_self');
这应该工作得很好。
使用路由定义URL的状态,并使用angular的$ location.path(“yourUrlName”)导航到状态页面。这将确保控制器值将在视图中更新。 – Vivz
@Vivz我试过了。问题是我想移动到第二个角度应用程序,而不是在同一个,所以使用状态不起作用。 – senschen
您可以尝试使用['$ location.path(url)'](https://docs.angularjs.org/api/ng/service/$location#path)来设置URL吗?另外,如果没有看到其他代码(一个示例plunker会很好),很难找出问题,但是您可以调试以查看这不是由调用[$ browser.onUrlChange()](https ://github.com/angular/angular.js/blob/15581287a4ec003680d158b303af07f5f16ffbf0/src/ng/location.js#L941)。 –