2017-10-12 5 views
3

J'ai deux applications angulaires dans le cadre de mon application. La première application est essentiellement la page de connexion, et la deuxième application est tout le reste. Les deux applications partagent un certain nombre de services, dont un qui contrôle les informations de connexion/logique.Passer d'une application AngularJS à une autre-- le contenu de la page ne se met pas à jour

Le problème se produit lorsqu'un utilisateur utilise la fonctionnalité «se souvenir de moi». Nous souhaitons qu'ils soient automatiquement connectés lorsqu'ils accèdent à la page de connexion et qu'ils soient redirigés vers la page d'état connectée. Le bit connecté automatiquement fonctionne correctement, mais lorsque nous tentons de rediriger l'utilisateur vers la page d'état, qui se trouve dans la deuxième application, il se bloque dans une boucle infinie où la page de connexion est actualisée à plusieurs reprises. (Il est intéressant, si l'utilisateur n'est pas connecté, entre les informations de connexion appropriées et clique sur le

Il semble que la redirection fonctionne, parce que l'URL se met à jour correctement et la page se rafraîchit, mais le contenu est faux (toujours l'ancien contrôleur et vue), donc il continue à refaire la même chose - vérifier pour voir si connecté, rediriger si oui Comment puis-je m'assurer que je transfère réellement à la deuxième application et charge la bonne vue/contrôleur sur un rediriger

code:

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

Définissez les états de vos URL à l'aide du routage et utilisez $ location.path ("yourUrlName") de angular pour accéder à la page d'état. Cela garantira que les valeurs du contrôleur seront mises à jour dans la vue. – Vivz

+0

@Vivz J'ai essayé ça.Le problème est que je veux passer à une deuxième application angulaire, pas dans le même, donc l'utilisation des états ne fonctionne pas. – senschen

+0

Pouvez-vous essayer d'utiliser ['$ location.path (url)'] (https://docs.angularjs.org/api/ng/service/$location#path) à la place pour définir l'URL? Aussi, il est difficile de comprendre le problème sans voir le reste du code (un exemple de plunker serait bien), mais vous pouvez déboguer pour voir si cela n'est pas dû à un appel à [$ browser.onUrlChange()] (https : //github.com/angular/angular.js/blob/15581287a4ec003680d158b303af07f5f16ffbf0/src/ng/location.js#L941) lorsque l'URL change. –

Répondre

0

Quelques suppositions

  1. Essayez d'utiliser la fenêtre de $ ou de fenêtre, pas les deux. Le bloc if (LoginData.get('SessionToken', null, true) !== null) peut fonctionner trop tôt. Essayez de le placer dans un bloc $ timeout pour voir si c'est différent.

+0

J'utilisais l'un ou l'autre, je les avais juste tous les deux dans l'exemple de code pour éviter les réponses évidentes "use $ window". Aussi, j'ai essayé de mettre cela si bloquer dans un délai d'attente, cela n'a pas résolu le problème. – senschen

0

Il vous semble LoginController App est bien, mais le lorsque l'utilisateur est redirigé vers la page toutes les autres valeurs que vous avez spécifié comme « l'authentification » ne reste pas même là, sauf le stockage de session. Je ne sais pas comment vous authentifiez l'utilisateur pour la vérification de connexion si elle est basée sur l'un de ces drapeaux parce que votre morceau de code vous convient. Gardez à l'esprit chaque fois que vous changez/redirigez vers un autre site, tout est de nouveau amorcé. Partagez le code de base de l'autre application ou assurez-vous que vos données de session (ou que vous vous authentifiez) sont basées sur les mêmes données.

+0

Il est définitivement basé sur les mêmes données - il y a un seul service LoginData qui est partagé entre les deux applications. – senschen

+0

alors il semble y avoir un problème entre l'autorisation/l'authentification. – ieatbytes

+0

On pourrait penser, mais la logique d'autorisation n'est jamais appelée pour la page d'état, seulement sur la page de connexion. Et là, il authentifie correctement. Je peux dire parce qu'il fait la tentative de changer de page. – senschen

0

Je tiens à souligner tout d'abord que la façon dont vous manipulez les choses n'est pas conseillée. Peu importe la complexité du traitement d'un projet via une application racine est plus facile à long terme.

Maintenant, une réponse spécifique à votre question.

Vérifiez les éléments dans $locationProvider afin qu'il n'y ait pas de scintillement etc. et après les rediriger vers la page qui gère les vues pour votre deuxième application.

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

Cela devrait fonctionner correctement.

+0

Pour les besoins particuliers du projet, c'est la seule façon de gérer la page de connexion. Je suis d'accord que cela rend tout plus compliqué, mais cela ne peut pas être fait dans une seule application. De plus, votre suggestion '$ window.open()' me donne une erreur: '10 $ digest() itérations atteintes. Aborting! ' – senschen

+0

Cela arrive parce que vous avez peut-être manqué quelque chose et que le nombre d'itérations augmente. Cela arrive généralement dans les cas où il vous manque quelque chose et la fonction est appelée plusieurs fois. Il est arrivé une fois avec moi quand j'ai oublié de gérer correctement les chèques, donc il était appelé nombre infini de fois. S'il vous plaît jeter un oeil à votre code. –

+0

Je l'ai corrigé pour que l'erreur n'apparaisse plus (avait la mauvaise URL); Cependant, le problème n'est toujours pas résolu: la boucle de rechargement est toujours en cours. – senschen