2013-02-02 18 views
19

Próbuję zmienić stronę, którą widzi użytkownik, gdy wejdzie na moją stronę. Jeśli są anonimowi, powinni zobaczyć stronę rejestru. Jeśli się zalogowali, powinien zobaczyć ich pulpit nawigacyjny.Przekierowanie strony indeksu, jeśli użytkownik jest zalogowany AngularJS

Mam usługę, która sprawdza, czy użytkownik jest zalogowany (np. Sprawdź pliki cookie), która uruchamia się po załadowaniu usług kątowych. Próbowałem użyć $ routeProvider do przekierowania, ale usługa nie została uruchomiona, gdy inicjalizowano $ routeProvider, więc zawsze myśli, że użytkownik nie jest zalogowany.

Potrafię łatwo przekierować po wstępnej stronie załadowany, ale staram się przekierować załadowaną pierwszą stronę. Czy ktoś może doradzić, jak to zrobić?

+0

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

Odpowiedz

20

Pamiętaj, aby przeczytać komentarz pod odpowiedzią. Kiedy odpowiedziałem na to pytanie, nie myślałem o testach jednostkowych i projektowaniu. Właśnie pokazałem, że to może być jeden z wielu sposobów na osiągnięcie pożądanego rezultatu.

Myślę, że najlepszym sposobem na zrobienie tego pod kontrolerem lub twoim app.config.run. W twoim przypadku powinieneś utworzyć inny moduł, aby sprawdzić status logowania użytkownika. Wsuń moduł sprawdzania statusu logowania użytkownika do modułu aplikacji.

Oto link do próbki następnie kodu 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

Dzięki za odpowiedź. Problem polega na tym, że podczas korzystania z $ routeProvider nie mogę uzyskać dostępu do logiki, aby sprawdzić, czy użytkownik jest zalogowany, ponieważ app.config jest ładowany przed załadowaniem usług. O ile nie robię tego źle i istnieje sposób sprawdzenia ciasteczek użytkowników, aby sprawdzić, czy są one zalogowane bez korzystania z usług? Jeśli tak, to mógłbym to sprawdzić po skonfigurowaniu app.config. Dzięki – rorymadden

+0

Jest to absolutnie wykonalne. Musisz stworzyć kolejny moduł i wprowadzić ten moduł do swojej głównej aplikacji. Zmieniłem odpowiednio swoją odpowiedź. –

+4

Nie jestem pewien, czy warto używać app.run; Jest to sprzeczne z podejściem odsprzęganym kątowo i sprawia, że ​​aplikacja jest trudna do przetestowania - za każdym razem, gdy ładujesz moduł aplikacji w teście, spróbujesz się zalogować! Na pewno możesz się zalogować w swoich testach, ale byłoby lepiej, gdybyś nie musiał się logować. – jdg

3

I właśnie to zrobił, dokonując atrapę szablon i mały kontroler/ścieżka, która przekierowuje odpowiednio.

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: '/' 
    }); 
}]); 
Powiązane problemy