【问题标题】:Switching from one AngularJS app to another-- page content not updating从一个 AngularJS 应用程序切换到另一个——页面内容没有更新
【发布时间】: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


【解决方案1】:

Using $window or $location to Redirect in AngularJS

我相信上述链接将帮助您解决问题。

【讨论】:

  • 我看到了那个问题,它的解决方案对我不起作用。我认为这个问题与必须在两个 Angular 应用程序之间切换有关。
【解决方案2】:

一些猜测

  1. 尝试使用 $window OR window,不要同时使用。

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

【讨论】:

  • 我使用了其中一个,我只是将它们都放在代码示例中,以防止明显的“使用 $window”答案。另外,我尝试将 if 块放在超时内,它并没有解决问题。
【解决方案3】:

您的 LoginController 应用程序似乎很好,但是当用户被重定向到其他页面时,您指定的所有值(例如“身份验证”)除了会话存储之外不会保持不变。我不知道您如何验证用户以进行登录检查它是否基于这些标志中的任何一个,因为您的这段代码很好。请记住,每次更改/重定向到其他站点时,每件事都会再次被引导。共享其他应用程序的基本代码或确保您的会话数据(或您的身份验证方式)基于相同的数据。

【讨论】:

  • 这绝对是基于相同的数据——两个应用程序之间共享一个单一的 LoginData 服务。
  • 那么授权/身份验证之间似乎有些问题。
  • 您可能会想,但从不会为状态页面调用授权逻辑,仅在登录页面上调用。它在那里正确地进行了身份验证。我可以判断,因为它会尝试更改页面。
【解决方案4】:

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

现在具体回答您的问题。

检查$locationProvider 中的内容,以免出现闪烁等问题,然后将它们重定向到处理第二个应用程序视图的页面。

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

这应该可以正常工作。

【讨论】:

  • 针对项目的特殊需求,只能这样处理登录页面。我同意它使一切变得更加复杂,但它不能在单个应用程序中完成。另外,您的$window.open() 建议给了我一个错误:10 $digest() iterations reached. Aborting!
  • 发生这种情况是因为您可能遗漏了一些东西并且迭代次数正在增加。这通常发生在您丢失某些内容并且该函数被多次调用的情况下。当我忘记正确处理支票时,它发生过一次,因此它被无数次调用。请查看您的代码。
  • 我修复了它,以便不再出现错误(输入错误的 url);但是,问题仍未解决 - 重新加载循环仍在发生。
  • 你能把我建议的东西摆弄一下吗,这是我自己做的......
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多