我的应用中有大量的angularjs路线。我想根据一些用户权限级别设置对这些路由的访问权限。
angular.module('myApp').run(['$rootScope', 'someAuthFactory', function($rootScope, someAuthFactory) {
$rootScope.$on('$stateChangeStart', function (event, toState) {
$rootScope.permissions = someAuthFactory.getPermssionLevels();
$rootScope.specialRights = $rootScope.permissions.indexOf('superRole') > -1;
...
这是我的路线之一:
.state("dashboard.overview", {
url: "/dashboard",
templateUrl: "app/dashboard.html",
resolve: {
roles: ['rootScope', function (rootScope) {
return $rootScope.specialRights;}]
},
所以这段代码有效,但如果我想添加这个:
resolve: {
roles: ['rootScope', function (rootScope) {
return $rootScope.specialRights;}]
}
到每条路线,它都会是重复的代码,或者如果我想查找其他角色,那就太无聊了。 我们能否让解决部分更小更清洁?
答案 0 :(得分:1)
在这样的路线之上的配置函数中创建一个变量
var resolveRoles = ['rootScope', function (rootScope) {
return $rootScope.specialRights;}]
}
并在每条路线中使用它,
.state("dashboard.overview", {
url: "/dashboard",
templateUrl: "app/dashboard.html",
resolve: {
roles: resolveRoles
},
});
答案 1 :(得分:0)
您可以创建一个服务/工厂,它共享$ rootScope.specialRights。只需在路由的第一个解析中初始化服务中的$ rootScope.specialRights,例如
.state("dashboard", {
url: ...
templateUrl: ...
resolve: {
roles: ['rootScope', function (rootScope) {
YourServiceOrFactory.setSpecialRights($rootScope.specialRights);
return $rootScope.specialRights
}]
},
在那里你需要它
YourServiceOrFactory.getSpecialRights()
它不必在其他结果中,只需在您的路径控制器或指令/组件中。比多个resovles更清洁和更好的表现。
答案 2 :(得分:0)
由于您已经在$rootScope
中设置了此属性,因此在所有路由中使用resolve
是一种过分的做法,只是为了获取变量值,当然,{{ 1}}不是为此目的而设计的。
相反,只需在控制器中注入resolve
,然后在控制器中使用$rootScope
。
示例:强>
在您的控制器,服务,指令或组件中,您可以像这样注入$rootScope.specialRights
:
$rootScope