检测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: '/'
});
}]);
通过使用$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
});
你应该在服务中添加一个事件处理程序到$rootScope而不是$scope。
如果你在"。run"部分添加$ routechangessuccess也会更好,这样所有的页面都可以从一个点监控,而不是在每个控制器中添加它
你需要监听$rootScope而不是$scope。
我认为最好在包装服务的init上调用这个监听器,例如(服务是单例的,所以一旦你将它注入任何控制器,它就会运行)。
angular.module('lmsApp')
.service('stateService', ['$rootScope', function ($rootScope) {
$rootScope.$on('$locationChangeStart', (event, next, current) => {
// do your magic
});
}]);
相关文章:
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 单击页面上的链接后高度发生变化
- 未激发路由的控制器属性上的观察者
- React redux初始化功能,无论状态变化如何
- AngularJS ui路由器html5模式中断路由
- 角度ng变化或ng点击选择can'不起作用
- 每个选择器的Jquery css颜色都在变化,但字体大小却没有变化
- 发送json对象或使用express路由呈现视图
- 使用主干网和rails的静态页面路由
- JS幻灯片与CSS背景颜色变化
- 如何使用Passport保护路由终结点
- 设置路由时,角度范围变量会发生变化
- 当路由发生变化时,如何在react路由器外处理
- 流星js的iron router:当路由发生变化时,应用CSS更改
- Ember JS:父路由/控制器如何观察它的子路由/控制器的变化?
- 检测Angular服务中的路由变化
- 如果路由或模型发生变化,则稍后取消ember .run. js
- 在ember应用中,每次url发生变化时,都会触发路由/控制器钩子