检测 Angular 服务中的路由更改

Detect route change in an Angular service

我正在尝试创建一项服务来检查某个路由是否需要用户登录才能访问该页面。我有一个工作代码,但我想将 $scope.$on('routeChangeStart) 函数放在服务中。我想把它放在一个服务中,因为我想在多个控制器中使用它。我该怎么做?

当前代码:

profileInfoCtrl.js

angular.module('lmsApp', ['ngRoute'])

.controller('profileInfoCtrl', ['$scope', '$location', ' 'pageAuth', function($scope, $location, pageAuth){

  //I want to include this in canAccess function
  $scope.$on('$routeChangeStart', function(event, next) {

    pageAuth.canAccess(event, next);
  });
}]);

pageAuth.js

 angular.module('lmsApp')

.service('pageAuth', ['$location', function ($location) {

  this.canAccess = function(event, next) {

    var user = firebase.auth().currentUser;


    //requireAuth is a custom route property
    if (next.$$route.requireAuth && user == null ) {

      event.preventDefault(); //prevents route change
      alert("You must be logged in to access page!");

    }
    else {
      console.log("allowed");
    }

  }

}]);

routes.js

 angular.module('lmsApp')
    .config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider){
      $routeProvider

.when('/admin', {
          templateUrl: 'view/admin.html',
          css: 'style/admin.css',
          controller: 'adminCtrl',
          requireAuth: true //custom property to prevent unauthenticated users
        })

        .otherwise({
          redirectTo: '/'
        });



    }]);

您可以将服务中的事件处理程序添加到 $rootScope 而不是 $scope。

此外,如果您在“.运行”部分添加 $routeChangeSuccess 会更好,这样所有页面都可以从一个点监控,而不是在每个控制器中都添加它

您需要监听 $rootScope 而不是 $scope。

而且我认为最好在包装服务的初始化时调用该侦听器,例如(服务是单例,所以一旦您将它注入任何控制器,它将是 运行)。

angular.module('lmsApp')

.service('stateService', ['$rootScope', function ($rootScope) {
    $rootScope.$on('$locationChangeStart', (event, next, current) => {
        // do your magic
    });

}]);

通过使用 $routeChangeStart,您将在每次更改路线时收听 $routeProvider 发送的广播。我不认为你需要在多个地方调用它(控制器),只是为了检查这个。
为您服务:

angular.module('lmsApp')
.service('pageAuth', ['$location', function ($location) {
var canAccess = function(event,next,current){

var user = firebase.auth().currentUser;
//requireAuth is a custom route property
    if (next.$$route.requireAuth && user == null ) {

      event.preventDefault(); //prevents route change
      alert("You must be logged in to access page!");

    }
    else {
      console.log("allowed");
    }

}

$rootScope.$on('$routeChangeStart',canAccess); 
}]);  

然后在应用程序的 .run() 部分注入您的服务。这将确保自动完成检查(如前所述通过广播)。
在你的配置部分:

angular.module('lmsApp')
    .run(function runApp(pageAuth){
 //rest of your stuff
});