20

ユーザーが自分の Web サイトにアクセスしたときに表示されるページを変更しようとしています。匿名の場合は、登録ページが表示されます。ログインしている場合は、ダッシュボードが表示されます。

ユーザーがログインしているかどうかを確認するサービス (Cookie の確認など) があり、Angular サービスが読み込まれたときにトリガーされます。$routeProvider を使用してリダイレクトしようとしましたが、$routeProvider が初期化されているときにサービスがトリガーされていないため、常にユーザーがログインしていないと見なされます。

最初のページが読み込まれたら簡単にリダイレクトできますが、読み込まれた最初のページをリダイレクトするのに苦労しています。誰でもこれを行う方法についてアドバイスできますか?

4

2 に答える 2

20

回答の下にあるコメントを必ずお読みください。この質問に答えたとき、単体テストと設計については考えていませんでした。目的の結果を達成するための多くの方法のうちの 1 つになり得ることを実証しただけです。

コントローラーまたはあなたの下でそれを行う最良の方法だと思います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';
});
于 2013-02-02T02:54:30.130 に答える
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: '/'
    });
}]);
于 2014-06-10T13:21:40.127 に答える