UI路由器的条件ui意见?
我无法弄清楚一个合理的方式来解决这个相当微不足道的问题。
我希望访客在访问网站索引和login用户时查看他们的个人资料,每个页面都有自己的模板和控制器。 理想情况下,一个url将有两个状态 ,不知何故,我将能够根据login状态自动更改活动的状态。 这两个视图都有自己的嵌套视图,所以ng-include不能被使用(我假设)。
我对angular度和UI路由器相当陌生,认为我可能忽略了一个简单的解决scheme。
可以用命名的视图和ng-show来完成吗?
如果您使用的是UI路由器,只需创build三种状态:根状态, '/'
URL以及两个不带URL的直接后代状态。 在根状态的onEnter
中,检测用户的状态并相应地转换到正确的子状态。 这给出了为两个子状态保持相同的URL的外观,但是允许你必须使用单独的configuration来分离状态。
templateUrl也可以是一个函数,因此您可以检查login状态并返回不同的视图,并在视图中定义控制器,而不是状态configuration的一部分
我的解决scheme
angular.module('myApp') .config(function ($stateProvider) { $stateProvider .state('main', { url: '/', controller: function (Auth, $state) { if (someCondition) { $state.go('state1'); } else { $state.go('state2'); } } }); });
状态1和状态2在别处定义。
为了文档的目的,我使用了:
$rootScope.$on('$stateChangeStart', function(event, toState) { if ((toState.name !== 'login') && (!$localStorage.nickname)) { event.preventDefault(); $state.go('login'); } });
使用$routeChangeStart
没有为我工作。
如果我理解这个问题, 你想确保没有login的用户看不到需要login的页面,这是正确的吗?
我已经在控制器中使用了这样的代码:
if(!'some condition that determines if user has access to a page'){ $location.path( "/login" ); }
任何地方(可能在一些高级控制器),你应该能够绑定一个'$routeChangeStart'
事件到$rootScope
,然后做你的检查:
$rootScope.$on('$routeChangeStart', function(next, current){ if(next != '/login' && !userLoggedIn){ $location.path( "/login" ); } });
每次设置新路线时,即使在首次访问该页面时,也会触发此function。
它在ui-route中用于我的条件视图
$stateProvider.state('dashboard.home', { url: '/dashboard', controller: 'MainCtrl', // templateUrl: $rootScope.active_admin_template, templateProvider: ['$stateParams', '$templateRequest','$rootScope', function ($stateParams, templateRequest,$rootScope) { var templateUrl =''; if ($rootScope.current_user.role == 'MANAGER'){ templateUrl ='views/manager_portal/dashboard.html'; }else{ templateUrl ='views/dashboard/home.html'; } return templateRequest(templateUrl); }] });