2013-02-02 10 views
19

Ich versuche die Seite zu variieren, die ein Benutzer sieht, wenn er auf meine Website geht. Wenn sie anonym sind, sollten sie die Registerseite sehen. Wenn sie sich eingeloggt haben, sollten sie ihr Dashboard sehen.Indexseite umleiten, wenn der Benutzer angemeldet ist AngularJS

Ich habe einen Dienst, der überprüft, ob der Benutzer angemeldet ist (z. B. check cookies), der ausgelöst wird, wenn die Angular-Dienste geladen werden. Ich habe versucht, den $ routeProvider zu umleiten, aber der Service wurde nicht ausgelöst, wenn der $ routeProvider initialisiert wird, also immer denkt, dass der Benutzer nicht angemeldet ist.

Ich kann leicht umleiten, sobald die erste Seite gewesen ist geladen, aber ich habe Probleme, die erste geladene Seite umzuleiten. Kann jemand Tipps geben, wie das geht?

+0

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

Antwort

20

Achten Sie darauf, den Kommentar unter der Antwort zu lesen. Als ich diese Frage beantwortete, dachte ich nicht über Unit Tests und Design nach. Ich habe nur gezeigt, dass, was kann eine von vielen Möglichkeiten, um das gewünschte Ergebnis zu erreichen

Ich denke, der beste Weg, es unter Controller oder Ihre app.config.run zu tun. In Ihrem Fall sollten Sie ein anderes Modul erstellen, um nach dem Benutzer-Login-Status zu suchen. Injizieren Sie das Benutzer-Login-Status-Prüfmodul in Ihr App-Modul.

Hier ist der Link zur

vom app.js Code gefolgt Probe

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

Vielen Dank für Ihre Antwort. Das Problem, das ich habe ist, dass wenn ich den $ routeProvider benutze, ich nicht auf die Logik zugreifen kann, um zu überprüfen, ob der Benutzer angemeldet ist, weil die app.config geladen wird, bevor die Dienste geladen werden. Es sei denn, ich mache es falsch, und es gibt eine Möglichkeit, die Cookies eines Benutzers zu überprüfen, um zu sehen, ob sie angemeldet sind, ohne Dienste zu benutzen? Wenn ja, dann könnte ich nachsehen, wenn ich die app.config einrichte. Danke – rorymadden

+0

Es ist absolut machbar.Sie müssen ein anderes Modul erstellen und dieses Modul in Ihre Haupt-App injizieren. Ich habe meine Antwort entsprechend geändert. –

+4

Ich bin mir nicht sicher, ob es eine gute Idee ist, app.run zu verwenden. Das geht gegen den entkoppelten Ansatz von eckig und macht die App schwer zu testen - jedes Mal, wenn Sie das App-Modul in einem Test laden, wird es versuchen, Sie einzuloggen! Natürlich können Sie sich tatsächlich in Ihren Tests anmelden, aber es wäre viel besser, wenn Sie sich nicht anmelden müssten. – jdg

3

ich dies nur tat, durch eine Dummy-Vorlage und Kleinsteuerung für den/Weg machen, die gegebenenfalls umleitet.

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: '/' 
    }); 
}]); 
Verwandte Themen