UI Router условный просмотр?

Я не могу найти разумный способ, который не похож на хак, решить эту довольно тривиальную проблему.

Я хочу, чтобы посетитель увидел всплывающую страницу, когда они обратились к индексу веб-сайта и зарегистрированному пользователю, чтобы просмотреть их профиль, причем каждая страница имеет собственный шаблон и контроллер. В идеале для одного URL должно существовать два состояния, и как-то я мог бы автоматически изменять активный в зависимости от состояния loggin. Оба эти представления будут иметь свои собственные вложенные представления, поэтому ng-include не может использоваться (я предполагаю).

Я новичок в angular и ui router, и думаю, что я мог бы игнорировать легкое решение проблемы.

Можно ли это сделать с именованными представлениями и ng-show?

Ответ 1

Если вы используете UI-маршрутизатор, просто создайте три состояния: состояние root, с URL '/' и два прямых состояния потомков без URL-адресов. В onEnter состояния корня вы определяете состояние пользователя и соответствующим образом переходите к правильному дочернему состоянию. Это дает вид сохранения одного и того же URL-адреса для обоих дочерних состояний, но позволяет вам разделить состояния с отдельными конфигурациями.

Ответ 2

templateUrl также может быть функцией, поэтому вы можете проверить состояние входа в систему и вернуть другое представление и определить контроллер в представлении а не как часть конфигурации состояния

Ответ 3

Мое решение:

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 определены в другом месте.

Ответ 4

Для целей документов я использовал:

$rootScope.$on('$stateChangeStart', function(event, toState) {
  if ((toState.name !== 'login') && (!$localStorage.nickname)) {
    event.preventDefault();
    $state.go('login');
  }
});

Использование $routeChangeStart не помогло мне.

Ответ 5

Если я пойму вопрос; вы хотите убедиться, что пользователь, который не вошел в систему, не может видеть страницу, требующую входа в систему. Это правильно?

Я сделал это с таким кодом внутри контроллера:

if(!'some condition that determines if user has access to a page'){
 $location.path( "/login" );
}

Ответ 6

В любом месте (возможно, в каком-то контроллере высокого уровня) вы должны просто привязать событие '$routeChangeStart' к $rootScope и выполнить проверку:

$rootScope.$on('$routeChangeStart', function(next, current){
    if(next != '/login' && !userLoggedIn){
        $location.path( "/login" );
    }
});

Это будет срабатывать каждый раз, когда будет установлен новый маршрут, даже при первом посещении страницы.

Ответ 7

Используется для меня условным видом в u-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);
        }]
      });

Ответ 8

То, как я это сделал, довольно просто. Я сделал один для нашей стратегии A/B-тестирования. Это суть:

resolve: {
   swapTemplate: function(service) {
      // all of this logic is in a service
      if (inAbTest) {
         this.self.templateUrl = '/new/template.html';
      }
   }
   ... other resolves
}

Это вызывается перед загрузкой шаблона, и поэтому вы можете поменять URL шаблона.

Ответ 9

В моем случае, если два состояния могут совместно использовать логику одного контроллера, условный шаблон является хорошим выбором. В противном случае создание отдельных состояний является хорошим вариантом.