Angularjs 完成条件视图的角度ui路由器
我问了一个与这个问题类似的问题:,但我的情况有点复杂,我似乎无法得到工作的答案 基本上,我有一个url,它可以以两种截然不同的方式呈现,具体取决于url指向的实体类型 这是我目前正在尝试的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) {
$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。然而,我认为你的解决方案也会很好,所以我接受它作为一个答案。