检测Angular服务中的路由更改

时间:2016-08-25 08:26:17

标签: javascript angularjs routes angularjs-scope ngroute

我试图创建一项服务来检查某条路线是否需要用户登录才能访问该页面。我有一个工作代码,但我想在服务中放置$ 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: '/'
        });



    }]);

3 个答案:

答案 0 :(得分:0)

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

如果要在" .run"中添加$ routeChangeSuccess会更好。因此,可以从一个点监视所有页面,而不是在每个控制器中添加它

答案 1 :(得分:0)

你需要听$ rootScope而不是$ scope。

我认为最好在包装服务的init上调用该侦听器,例如(服务是单例,所以一旦你将它注入任何控制器就会运行它)。

angular.module('lmsApp')

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

}]);

答案 2 :(得分:0)

通过使用 $ 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
});