2013-02-02 21 views
19

私は自分のウェブサイトに行くときにユーザーが見るページを変えようとしています。彼らが匿名の場合は、登録ページが表示されます。ログインしている場合は、ダッシュボードが表示されます。ユーザーがログインしている場合にインデックスページをリダイレクトする

私は、Angularサービスがロードされたときにトリガーするユーザーがログインしているかどうかを確認するサービスを提供しています。 $ routeProviderをリダイレクトするために$ routeProviderを使用しようとしましたが、$ routeProviderが初期化されているときにサービスが起動されていないため、ユーザーはログインしていないと常に考えられます。

最初のページがロードされた最初のページをリダイレクトするのには苦労しています。誰もこれを行う方法のアドバイスを与えることができますか?

+0

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

答えて

20

答えの下にあるコメントを必ず読んでください。私がこの質問に答えたとき、私は単体テストとデザインについては考えなかった。私はちょうど望む結果を達成するための多くの方法の一つであることを実証していた。

私はコントローラまたはあなたのapp.config.runの下でそれを行うための最善の方法だと思う。 あなたの場合、別のモジュールを作成してユーザーのログインステータスを確認する必要があります。ユーザーログインステータスチェックモジュールをアプリケーションモジュールに注入します。ここ

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

感謝。私が持っている問題は、$ routeProviderを使用すると、サービスがロードされる前にapp.configがロードされているため、ユーザーがログインしているかどうかを確認するロジックにアクセスできません。私が間違っている場合を除き、ユーザークッキーをチェックしてサービスを使用せずにログインしているかどうかを確認する方法はありますか?もしそうなら、私はapp.configをセットアップするときにそれを確認することができます。おかげで – rorymadden

+0

それは絶対にdoable.Youは別のモジュールを作成し、メインのアプリケーションにそのモジュールを注入する必要があります。私はそれに応じて私の答えを変更しました。 –

+4

app.runを使用することをお勧めします。これは角度の分離されたアプローチに逆らって、アプリをテストするのを難しくします---アプリモジュールをテストにロードするたびに、ログインしようとしています!確かに実際にあなたのテストにログインすることができますが、ログインする必要がなければそれは良い方法でしょう。 – jdg

3

続いて試料にリンクされている私はちょうど適切にリダイレクト/経路のためのダミーテンプレートと小さな制御を行うことで、これをしませんでした。あなたの応答のための

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: '/' 
    }); 
}]); 
関連する問題