Подтвердить что ты не робот

Перенаправить страницу индекса, если пользователь зарегистрирован в AngularJS

Я пытаюсь изменить страницу, которую пользователь видит, когда они идут на мой сайт. Если они анонимны, они должны увидеть страницу регистрации. Если они вошли в систему, они должны увидеть свою панель.

У меня есть служба, которая проверяет, зарегистрирован ли пользователь (например, отметьте куки), который запускается при загрузке служб Angular. Я попытался использовать $routeProvider для перенаправления, но служба не была запущена, когда инициализируется $routeProvider, поэтому он всегда думает, что пользователь не вошел в систему.

Я могу легко перенаправлять, как только начальная страница загружена, но я пытаюсь перенаправить загруженную первую страницу. Может ли кто-нибудь дать совет о том, как это сделать?

4b9b3361

Ответ 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';
});

Ответ 2

Я просто сделал это, создав фиктивный шаблон и небольшой контроллер для /path, который перенаправляет по мере необходимости.

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