Angular ui-router для выполнения условного просмотра

Я задаю аналогичный вопрос на этот вопрос: условный ui-интерфейс UI-маршрутизатора?, но моя ситуация немного сложнее, и я не могу получить предоставленную ответ на работу.

В принципе, у меня есть URL-адрес, который может отображаться двумя разными способами, в зависимости от типа объекта, на который указывает URL-адрес.

Вот что я сейчас пытаюсь сделать

    $stateProvider
        .state('home', {
            url : '/{id}',
            resolve: {
                entity: function($stateParams, RestService) {
                    return RestService.getEntity($stateParams.id);
                }
            },
            template: 'Home Template <ui-view></ui-view>',
            onEnter: function($state, entity) {
                if (entity.Type == 'first') {
                    $state.transitionTo('home.first');
                } else {
                    $state.transitionTo('home.second');
                }
            }
        })
        .state('home.first', {
            url: '',
            templateUrl: 'first.html',
            controller: 'FirstController'
        })
        .state('home.second', {
            url: '',
            templateUrl: 'second.html',
            controller: 'SecondController'
        });

Я установил Resolve для извлечения фактического объекта из резервной службы. Кажется, что все работает, пока я не перейду на переход на основе этого типа.

Кажется, что переход работает, за исключением того, что происходит повторный вызов разрешения, и getEntity терпит неудачу, потому что идентификатор является нулевым.

Я попытался отправить идентификатор на вызовы перехода, но затем он все еще пытается выполнить второе решение, то есть объект дважды извлекается из службы останова.

Похоже, что в обработчике onEnter состояние еще не изменилось, поэтому, когда переход происходит, он думает, что он переходит в совершенно новое состояние, а не в дочернее. Это еще раз подтверждается, потому что когда я удаляю объект. от имени состояния в transitionTo, он считает, что текущее состояние является корневым, а не домашним. Это также мешает мне использовать "go" вместо перехода.

Любые идеи?

Ответ 1

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

$stateProvider.state('home', {
  templateProvider: ['$stateParams', 'restService' , function ($stateParams, restService) {
    restService.getEntity($stateParams.id).then(function(entity) {
        if (entity.Type == 'first') {
              return '<div ng-include="first.html"></div>;
        } else {
              return '<div ng-include="second.html"></div>';
        }
    });
  }]
})

Ответ 2

Вы также можете сделать следующее:

$stateProvider
        .state('home', {
            url : '/{id}',
            resolve: {
                entity: function($stateParams, RestService) {
                    return RestService.getEntity($stateParams.id);
                }
            },
            template: 'Home Template <ui-view></ui-view>',
            onEnter: function($state, entity) {
                if (entity.Type == 'first') {
                    $timeout(function() {
                            $state.go('home.first');
                        }, 0);
                } else {
                    $timeout(function() {
                            $state.go('home.second');
                        }, 0);
                }
            }
        })
        .state('home.first', {
            url: '',
            templateUrl: 'first.html',
            controller: 'FirstController'
        })
        .state('home.second', {
            url: '',
            templateUrl: 'second.html',
            controller: 'SecondController'
        });

Ответ 3

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

Ответ 4

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