2013-02-02 38 views
19

Bir kullanıcının web siteme gittiğinde gördüğü sayfayı değiştirmeye çalışıyorum. Anonim iseler, kayıt sayfasını görmelidirler. Giriş yapmışlarsa panolarını görmeliler.Kullanıcı içeriyorsa, yeniden yönlendirme sayfası AngularJS

Açısal servisler yüklendiğinde tetikleyen kullanıcının oturum açıp açmadığını (ör., Çerezleri kontrol et) denetleyen bir hizmetim var. Yönlendirme için $ routeProvider'ı kullanmaya çalıştım ancak $ routeProvider başlatıldığında hizmet başlatılmadı, böylece kullanıcı her zaman oturum açmadığını düşünüyor.

İlk sayfa açıldıktan sonra kolayca yeniden yönlendirebilirim Yüklendi ancak yüklenen ilk sayfayı yönlendirmek için uğraşıyorum. Bunu nasıl yapacakları konusunda tavsiyede bulunabilir mi?

+0

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

cevap

20

Yanıtın altındaki yorumu okuduğunuzdan emin olun. Bu soruyu cevapladığımda ünite testleri ve tasarımı hakkında düşünmedim. İstenilen sonuca ulaşmak için birçok yoldan birinin ne olabileceğini gösteriyorum

Denetleyicinin veya app.config.run'un altında yapmanın en iyi yolu. Sizin durumunuzda, kullanıcı giriş durumunu kontrol etmek için başka bir modül oluşturmalısınız. Uygulama modülünüze kullanıcı giriş durumu kontrol modülünü enjekte edin. İşte

Sadece uygun yönlendirmeleri/yolu için bir kukla şablonu ve küçük kontrolör yaparak, bunu

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

teşekkürler. Sahip olduğum sorun, $ routeProvider kullanılırken, uygulamanın yüklenmesinden önce app.config yüklendiğinden, kullanıcının oturum açıp açmadığını kontrol etmek için mantığa erişemem. Yanlış yapmıyorum ve hizmet kullanmadan oturum açıp açılmadıklarını görmek için kullanıcı çerezlerini kontrol etmenin bir yolu var mı? Öyleyse, app.config dosyasını kurduğumda kontrol edebilirim. Teşekkürler – rorymadden

+0

Kesinlikle yapılabilir. Başka bir modül oluşturmalı ve bu uygulamayı ana uygulamanıza enjekte etmelisiniz. Cevabımı buna göre değiştirdim. –

+4

App.run'u kullanmak iyi bir fikir olduğundan emin değilim; Bu açısal dekupled yaklaşım karşı gider ve uygulamayı test etmek zor yapar --- her app size bir test içinde yüklediğinizde size giriş denemek için gidiyor! Testlerinizde gerçekten giriş yapabileceğinizden emin olun, ancak giriş yapmanız gerekmiyorsa daha iyi olacaktır. – jdg

3

app.js kodunu takiben örnek bağlantıdır. Yanıtınız için

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