Angularjs 完成条件视图的角度ui路由器

Angularjs 完成条件视图的角度ui路由器,angularjs,angular-ui,angular-ui-router,Angularjs,Angular Ui,Angular Ui Router,我问了一个与这个问题类似的问题:,但我的情况有点复杂,我似乎无法得到工作的答案 基本上,我有一个url,它可以以两种截然不同的方式呈现,具体取决于url指向的实体类型 这是我目前正在尝试的 $stateProvider .state('home', { url : '/{id}', resolve: { entity: function($stateParams, RestService) {

我问了一个与这个问题类似的问题:,但我的情况有点复杂,我似乎无法得到工作的答案

基本上,我有一个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'
        });
$stateProvider
.州(“家”{
url:'/{id}',
决心:{
实体:函数($stateparms,RestService){
返回RestService.getEntity($stateparms.id);
}
},
模板:“主模板”,
onEnter:函数($state,entity){
如果(entity.Type=='first'){
$state.transitiono('home.first');
}否则{
$state.transitiono('home.second');
}
}
})
.state('home.first'{
url:“”,
templateUrl:'first.html',
控制器:“第一控制器”
})
.state('home.second'{
url:“”,
templateUrl:'second.html',
控制器:“第二控制器”
});
我设置了从restful服务获取实际实体的解析。 每件事似乎都在运行,直到我真正实现了基于类型的转换

转换似乎有效,但resolve重新激发,getEntity由于id为null而失败

我尝试将id发送到Transitiono调用,但它仍然尝试进行第二次解析,这意味着该实体将从rest服务获取两次

似乎正在发生的是,在onEnter处理程序中,状态实际上还没有改变,因此当转换发生时,它认为它正在转换到一个全新的状态,而不是子状态。这是进一步证明,因为当我删除该实体时。从Transitiono中的状态名称来看,它认为当前状态是root,而不是home。这也阻止了我使用“go”而不是Transitiono

有什么想法吗?

也可以是函数,因此您可以检查类型并返回不同的视图,并在视图中定义控制器,而不是作为状态配置的一部分。无法将参数注入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'){
templateProvider:['$stateParams','restService',函数($stateParams,restService){
getEntity($stateparms.id)。然后(函数(实体){
如果(entity.Type=='first'){
返回';
}否则{
返回“”;
}
});
}]
})

我最终使家庭控制器成为第一个和第二个的兄弟,而不是父母,然后让家庭控制器执行$state。根据解析结果转到第一个或第二个。

您还可以执行以下操作:

$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'
        });
$stateProvider
.州(“家”{
url:'/{id}',
决心:{
实体:函数($stateparms,RestService){
返回RestService.getEntity($stateparms.id);
}
},
模板:“主模板”,
onEnter:函数($state,entity){
如果(entity.Type=='first'){
$timeout(函数(){
$state.go('home.first');
}, 0);
}否则{
$timeout(函数(){
$state.go('home.second');
}, 0);
}
}
})
.state('home.first'{
url:“”,
templateUrl:'first.html',
控制器:“第一控制器”
})
.state('home.second'{
url:“”,
templateUrl:'second.html',
控制器:“第二控制器”
});

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

也许需要一个控制器来初始化
id
谢谢,阿曼。我最终把家变成了另外两个的兄弟,让控制器根据解析结果执行$state.go。然而,我认为你的解决方案也会很好,所以我接受它作为一个答案。