2

Я пытаюсь ограничить доступ пользователя к просмотру /topics и виду /question. У меня есть форма входа на главную страницу. Мой HomeCtrl имеет следующую функцию входа:

$scope.doLogin = function() { 
     var user = { 
      username: $scope.username, 
      password: $scope.password 
     } 
     $http.post('data/user/users.json', 
      user 
     ).success(function(data, status, headers, config) { 
      userService.isAuthenticated = true; 
      userService.username = data.username; 
      userService.password = data.password; 
      $location.path('/topics'); 
      console.log('Yay! You logged in.') 
     }).error(function(data, status, headers, config) { 
      userService.isAuthenticated = false; 
      userService.username = ''; 
      userService.password = ''; 
      $scope.errorMessage = 'Failed to log in. Please check username and password.' 
     }); 

    } 

И у меня есть завод создан для обработки текущего состояния данных:

angular.module('myApp.userService', []). 
factory('userService', function() { 
    var credentials = { 
     username: '', 
     password: '', 
     isAuthenticated: false 
    }; 

    return credentials; 

}); 

И это мой $ routeProvider:

config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
    when('/', { 
     templateUrl: 'partials/home.html', 
     controller: 'HomeCtrl' 
    }). 
    when('/topics', { 
     templateUrl: 'partials/topics.html', 
     controller: 'TopicCtrl', 
     //resolve: isAuthenticated 
    }). 
    when('/question', { 
     templateUrl: 'partials/question.html', 
     controller: 'QuestionCtrl', 
     //resolve: isAuthenticated 
    }). 
    when('/terms', { 
     templateUrl: 'partials/terms.html', 
     controller: 'TermsCtrl' 
    }). 
    otherwise({ 
     redirectTo: '/' 
    }); 
}]); 

Я пробовал установить следующее:

resolve: { 
    doLogin: HomeCtrl.doLogin 
    } 

Но что возвращает следующее сообщение об ошибке:

Failed to instantiate module myApp due to: ReferenceError: HomeCtrl is not defined at http:// localhost/2014-02-10/app/js/app.js:33:18 at Object.d [as invoke]

Любая помощь очень ценится - Я смотрел на это весь день, и это сводит меня с ума.

ответ

4

Игнорирование ошибки, это не было бы правильным способом решения этой проблемы, поскольку вы не можете разоблачить HomeController, как вы думаете, а не с каждой настройкой зависимостей (например, $ scope).

Вы можете попытаться захватить $ locationChangeStart, в какой-то контроллер, который определен вне ng-view или использовать run блок ограничения для входа пользователю

app.run(function($location, $rootScope, $route, userService) { 
    $rootScope.$on('$locationChangeStart', function(evt, next, current) { 
    var nextPath = $location.path(), 
     nextRoute = $route.routes[nextPath]; 
    if (nextRoute && nextRoute.auth && !loggedIn) { 
     $location.path("/home"); 
    } 
    }); 
}); 

Также маршруты должны быть определены как

when('/topics', { 
     templateUrl: 'partials/topics.html', 
     controller: 'TopicCtrl', 
     auth: true 
    }) 

См. Это SO post и plunkr, чтобы получить представление об ошибке.

+0

Большое спасибо! Я решился, но это прекрасно работает. Я подключил .run к моему userService, и он отлично работает с изменениями переменных. Я ценю помощь. Благодарю. – robertbabington

+0

$ route.routes [nextPath] - не работает, когда в URL-адресе формы/whatever /: param присутствует параметр – Jasper

 Смежные вопросы

  • Нет связанных вопросов^_^