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); }] });