我正在编写一个具有登录视图和主视图的小型 AngularJS 应用程序,配置如下:
$routeProvider .when('/main' , {templateUrl: 'partials/main.html', controller: MainController}) .when('/login', {templateUrl: 'partials/login.html', controller: LoginController}) .otherwise({redirectTo: '/login'});
我的 LoginController 检查用户/密码组合并在 $rootScope 上设置一个属性,以反映这一点:
function LoginController($scope, $location, $rootScope) { $scope.attemptLogin = function() { if ( $scope.username == $scope.password ) { // test $rootScope.loggedUser = $scope.username; $location.path( "/main" ); } else { $scope.loginError = "Invalid user/pass."; } }
一切正常,但如果我访问,http://localhost/#/main我最终会绕过登录屏幕。我想写类似“每当路由更改时,如果 $rootScope.loggedUser 为空,则重定向到 /login”
http://localhost/#/main
…
… 等待。我可以以某种方式收听路由更改吗?无论如何,我都会发布这个问题并继续寻找。
在浏览了一些文档和源代码之后,我想我得到了它的工作。也许这对其他人有用?
我将以下内容添加到我的模块配置中:
angular.module(...) .config( ['$routeProvider', function($routeProvider) {...}] ) .run( function($rootScope, $location) { // register listener to watch route changes $rootScope.$on( "$routeChangeStart", function(event, next, current) { if ( $rootScope.loggedUser == null ) { // no logged user, we should be going to #login if ( next.templateUrl != "partials/login.html" ) { // not going to #login, we should redirect now $location.path( "/login" ); } } }); })
一件看起来很奇怪的事情是我必须测试部分名称 ( login.html),因为“下一个”Route 对象没有 url 或其他东西。也许有更好的方法?
login.html