Угловой UI-маршрутизатор для выполнения условного вида

StackOverflow https://stackoverflow.com//questions/25047884

Вопрос

Я спрашиваю подобного вопроса к этому вопросу: 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'
        });
.

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

Переход, по-видимому, работает, за исключением перепродажи повторных пожаров и претенденция не удается, потому что идентификатор является NULL.

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

Что, кажется, происходит, так это то, что в обработчике одиннадцатого штата еще не изменилось, поэтому, когда произойдет переход, он думает, что он переходит на совершенно новое состояние, а не к дочернему государству. Это дополнительно свидетельствует, потому что когда я удаляю сущность. Из названия государства в переходе, он считает, что текущее состояние является корнем, а не в домашних условиях. Это также мешает мне использовать «идти» вместо перехода.

Любые идеи?

Это было полезно?

Решение

href="http://github.com/angular-ui/ui-router/wiki#templates"> 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>';
        }
    });
  }]
})
.

Другие советы

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

$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'
        });
.

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

Используйте проверенный код для условного вида в UI-маршруте

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top