20

我试图改变用户在访问我的网站时看到的页面。如果他们是匿名的,他们应该会看到注册页面。如果他们已经登录,他们应该会看到他们的仪表板。

我有一个服务可以检查用户是否登录(例如检查 cookie),它会在 Angular 服务加载时触发。我曾尝试使用 $routeProvider 进行重定向,但在初始化 $routeProvider 时尚未触发服务,因此它始终认为用户未登录。

加载初始页面后,我可以轻松重定向,但我正在努力重定向加载的第一页。任何人都可以就如何做到这一点提供建议吗?

4

2 回答 2

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';
});
于 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 回答