Angular ui-router完成条件视图

时间:2014-07-30 22:14:49

标签: angularjs angular-ui angular-ui-router

我问这个问题类似的问题:UI Router conditional ui views?,但我的情况有点复杂,我似乎无法得到所提供的答案。

基本上,我有一个可以呈现两种截然不同的方式的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来从一个宁静的服务中获取实际的实体。 似乎每件事情都有效,直到我真正根据类型进入transitionTo。

转换似乎有效,除了重新触发并且getEntity失败,因为id为null。

我已经尝试将id发送到transitionTo调用,但是它仍然尝试进行第二次解析,这意味着实体从其余服务中获取两次。

似乎正在发生的事情是,在onEnter处理程序中,状态还没有实际改变,所以当转换发生时,它认为它正在转换到一个全新的状态而不是一个子状态。这进一步证明了,因为我删除了实体。从transitionTo中的州名,它认为当前的状态是root,而不是home。这也阻止了我使用&#39; go&#39;而不是transitionTo。

有什么想法吗?

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:9)

您还可以执行以下操作:

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

答案 2 :(得分:3)

我最终让家庭控制器成为第一个和第二个兄弟,而不是父母,然后让家里的控制器根据解决的结果做第一个或第二个$ state.go。

答案 3 :(得分:0)

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