从一个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; 
      }); 
    }; 

}); 
+0

使用路由定义URL的状态,并使用angular的$ location.path(“yourUrlName”)导航到状态页面。这将确保控制器值将在视图中更新。 – Vivz

+0

@Vivz我试过了。问题是我想移动到第二个角度应用程序,而不是在同一个,所以使用状态不起作用。 – senschen

+0

您可以尝试使用['$ 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)。 –

Using $window or $location to Redirect in AngularJS

我相信上面提到的链接可以帮助你解决你的问题。

+0

我看到了这个问题,它的解决方案对我来说并不适用。我认为这个问题与不得不在两个角度应用程序之间切换有关。 – senschen

有猜测

  1. 尝试使用$窗口或窗口,而不是两个。

  2. if (LoginData.get('SessionToken', null, true) !== null)块可能运行得太快。尝试将它放在$超时块中,看看它是否有所不同。

+0

我正在使用其中之一,我只是让它们都在代码示例中,以防止显而易见的“使用$窗口”答案。另外,我试图说,如果在超时内阻止,它并没有解决问题。 – senschen

看来你的LoginController应用是好的,但在用户被重定向到其他页面所有你喜欢指定的值“认证”并不只是会话存储保持同样存在。我不知道你是如何验证用户的登录检查,如果它基于任何这些标志,因为你的这段代码是好的你。请记住,每当你改变/重定向到其他网站时,每一件事都会被重新引导。要么共享其他应用程序基本代码,要么确保会话数据(或者您如何进行身份验证)基于相同的数据。

+0

它绝对基于相同的数据 - 在这两个应用程序之间共享一个LoginData服务。 – senschen

+0

那么它似乎是授权/认证之间的问题。 – ieatbytes

+0

您可能会想,但授权逻辑从不会被调用状态页面,只能在登录页面上调用。并且它在那里正确认证。我可以说,因为它使得尝试改变页面。 – senschen

我想首先指出你处理事物的方式不可取。无论一个项目通过一个根应用程序处理它有多复杂,从长远来看都更容易。

现在针对您的问题的具体答案。

检查$locationProvider中的东西,以便没有闪烁等,然后将它们重定向到处理第二个应用程序的视图的页面。

$window.open('root_page_second_app.html', '_self'); 

这应该工作得很好。

+0

对于项目的特殊要求,这是处理登录页面的唯一方法。我同意它使一切变得更加复杂,但它不能在单个应用程序中完成。另外,你的'$ window.open()'建议给我一个错误:达到10 $ digest()迭代。正在中止!' – senschen

+0

发生这种情况的原因可能是你错过了一些东西,并且迭代次数正在增加。这通常发生在你缺少某些东西并且该函数被多次调用的情况下。当我忘记正确处理检查时,它曾经发生过,因此它被称为无限次数。请看看你的代码。 –

+0

我修正了这个错误,使得错误不再出现(有错误的url);但是,问题仍然没有解决 - 重新加载循环仍在发生。 – senschen