2013-02-02 12 views
19

Sto provando a variare la pagina che un utente vede quando accede al mio sito web. Se sono anonimi dovrebbero vedere la pagina del registro. Se hanno effettuato l'accesso dovrebbero vedere la loro dashboard.Pagina dell'indice di reindirizzamento se l'utente è connesso AngularJS

Ho un servizio che verifica se l'utente ha effettuato l'accesso (ad esempio controlla i cookie) che si attiva quando i servizi Angular vengono caricati. Ho provato ad usare il $ routeProvider per reindirizzare ma il servizio non è stato attivato quando $ routeProvider è stato inizializzato in modo da pensare sempre che l'utente non abbia effettuato il login.

Posso reindirizzare facilmente una volta che la pagina iniziale è stata caricato ma sto lottando per reindirizzare la prima pagina caricata. Qualcuno può dare consigli su come farlo?

+0

https://groups.google.com/forum/#!msg/angular/ki5rzHoRciw/0hBkkXSfvlMJ –

risposta

20

Leggere il commento sotto la risposta. Quando ho risposto a questa domanda, non ho pensato ai test unitari e al design. Stavo solo dimostrando che quello che può essere uno dei tanti modi per ottenere il risultato desiderato

Penso che il modo migliore per farlo sotto il controller o il tuo app.config.run. Nel tuo caso dovresti creare un altro modulo per verificare lo stato di accesso dell'utente. Inietta il modulo di controllo dello stato di accesso utente al modulo dell'app.

ecco il link al campione, seguito dal codice app.js

http://plnkr.co/edit/dCdCEgLjLeGf82o1MttS

var login = angular.module('myLoginCheck', []) 
    .factory('$logincheck', function() { 
    return function (userid) { 
     // Perform logical user logging. Check either 
     // by looking at cookies or make a call to server. 
     if (userid > 0) return true; 
     return false; 
    }; 
    }); 

var app = angular.module('myApp', ['myLoginCheck']); 

app.config(function ($routeProvider, $locationProvider) { 
    $routeProvider 
     .when('/publicurl', {}) 
     .when('/loginurl', {}) 
     .when('/unauthorize', {}) 
     .otherwise({redirectTo: '/'}); 
    }) 
    .run(function ($logincheck, $location) { 
    //console.log("Into run mode"); 
    console.log("Userid 5 is logged in: ", $logincheck(5)); 
    console.log("Userid 0 logged in: ", $logincheck(0)); 

    //now redirect to appropriate path based on login status 
    if ($logincheck(0)) { 
     //$location.path('/loginurl'); or   
    } 
    else { 
     //$location.path('/publicurl'); or 
    } 
    }); 

app.controller('MainCtrl', function ($scope) { 
    $scope.name = 'World'; 
}); 
+1

Grazie per la risposta. Il problema che ho è che quando si utilizza $ routeProvider non riesco ad accedere alla logica per verificare se l'utente è loggato perché l'app.config viene caricato prima che i servizi vengano caricati. A meno che non stia sbagliando e c'è un modo per controllare i cookie degli utenti per vedere se sono loggati senza usare i servizi? Se è così, allora potrei controllarlo quando installerò app.config. Grazie – rorymadden

+0

È assolutamente fattibile. Devi creare un altro modulo e iniettarlo nel tuo app principale. Ho cambiato la mia risposta di conseguenza. –

+4

Non sono sicuro che sia una buona idea usare app.run; questo va contro l'approccio disaccoppiato di angular e rende l'applicazione difficile da testare --- ogni volta che si carica il modulo dell'app in un test, tenterà di collegarsi! Certo, puoi effettivamente accedere ai tuoi test, ma sarebbe meglio se non dovessi fare il login. – jdg

3

ho appena fatto questo, facendo un modello di manichino e piccolo controller per il/percorso che reindirizza a seconda dei casi.

controllers.controller('loginController', 
         ['$scope', '$location', '$cookies', 
         function($scope, $location, $cookies) { 
    if (!!$cookies.user) { 
     console.log("already logged in!"); 
     $location.path('/shows'); 
    } else { 
     console.log("need to login!"); 
     $location.path('/users'); 
    } 
}]); 

var app = angular.module('app', ['ngRoute', 'ngCookies', 'controllers', 'services']); 

app.config(['$routeProvider', 
      function($routeProvider) { 
    $routeProvider.when('/users', { 
     templateUrl: "partial/users.html", 
     controller: 'userController' 
    }); 
    $routeProvider.when('/shows', { 
     templateUrl: "partial/shows.html", 
     controller: 'showController' 
    }); 
    $routeProvider.when('/', { 
     template: '', 
     controller: 'loginController' 
    }); 
    $routeProvider.otherwise({ 
     redirectTo: '/' 
    }); 
}]); 
Problemi correlati