请考虑以下事项:
.state('manager.staffList', {url:'^/staff?alpha', templateUrl: 'views/staff.list.html', data:{activeMenu: 'staff'}, controller: 'staffListCtrl'})
.state('manager.staffDetail', {url:'^/staff/{id}' , templateUrl: 'views/staff.html', data:{activeMenu: 'staff'}, controller: 'staffDetailsCtrl'})
.state('manager.staffDetail.view', {url:'/view', templateUrl: 'views/staff.details.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.schedule', {url:'/schedule', templateUrl:'views/staff.view.schedule.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.history', {url:'/history' , templateUrl:'views/staff.view.history.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.log', {url:'/log', templateUrl:'views/staff.view.log.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.files', {url:'/files', templateUrl:'views/staff.view.files.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.edit', {url:'/edit', templateUrl: 'views/staff.edit.html', data:{activeMenu: 'staff'}})
如果我转到domain.com/staff/1234/view
,我如何默认为manager.staffDetail.view.schedule
子状态?
答案 0 :(得分:136)
首先,将属性添加到 'manager.staffDetail.view'
的abstract:true
状态。这不是必需的,但你想设置它,因为你永远不会直接进入这个状态,你总是会去其中一个孩子状态。
然后执行以下一个:
为'manager.staffDetail.view.schedule'
州提供空网址。这将使其与父状态URL匹配相同的URL,因为它不会向父URL添加任何内容。
.state('manager.staffDetail.view.schedule', {url:'', ...
或者,如果您想保持默认子路由的URL不变,请在module.config中设置重定向。此处的代码会将'/staff/{id}/view'
的任何位置重定向到'/staff/{id}/view/schedule'
的位置:
$urlRouterProvider.when('/staff/{id}/view', '/staff/{id}/view/schedule');
答案 1 :(得分:20)
要设置默认子视图,请选中此example。点击Route 1
加载默认状态route1.list
// For any unmatched url, send to /route1
$stateProvider
.state('route1', {
url: "/route1",
abstract:true ,
templateUrl: "route1.html"
})
.state('route1.list', {
url: '',
templateUrl: "route1.list.html",
controller: function($scope){
$scope.items = ["A", "List", "Of", "Items"];
}
})
.state('route1.desc', {
url: "/desc",
templateUrl: "route1.desc.html",
controller: function($scope){
$scope.items = [];
}
})
.state('route2', {
url: "/route2",
templateUrl: "route2.html"
})
.state('route2.list', {
url: "/list",
templateUrl: "route2.list.html",
controller: function($scope){
$scope.things = ["A", "Set", "Of", "Things"];
}
})
答案 2 :(得分:8)
我遇到了同样的问题,发现这个解决方案有效:
https://github.com/angular-ui/ui-router/issues/948#issuecomment-75342784
这是引自@christopherthielen的github
"现在,不要宣布你的州摘要,并使用这个食谱:"
app.run($rootScope, $state) {
$rootScope.$on('$stateChangeStart', function(evt, to, params) {
if (to.redirectTo) {
evt.preventDefault();
$state.go(to.redirectTo, params)
}
});
}
$stateProvider.state('parent' , {
url: "/parent",
templateUrl: "parent.html",
redirectTo: 'parent.child'
});
$stateProvider.state('parent.child' , {
url: "/child",
templateUrl: "child.html"
});
以下是该流程如何运作的细分:
答案 3 :(得分:7)
很晚但我认为你可以"重定向"到你想要的状态。
.state('manager.staffDetail.view', {
url:'/view',
templateUrl: 'views/staff.details.html',
controller: 'YourController'
})
app.controller('YourController', ['$state',
function($state) {
$state.go('manager.staffDetail.view.schedule');
}]);
您可以直接在状态配置中为您编写控制器。
答案 4 :(得分:3)
我将'manager.staffDetial.view'更改为抽象状态,并将我的默认子状态的url保留为空白''
// Staff
.state('manager.staffList', {url:'^/staff?alpha', templateUrl: 'views/staff.list.html', data:{activeMenu: 'staff'}, controller: 'staffListCtrl'})
.state('manager.staffDetail', {url:'^/staff/{id}', templateUrl: 'views/staff.html', data:{activeMenu: 'staff'}, controller: 'staffDetailsCtrl'})
.state('manager.staffDetail.view', {url:'/view', abstract: true, templateUrl: 'views/staff.details.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.schedule', {url:'', templateUrl:'views/staff.view.schedule.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.history', {url:'/history', templateUrl:'views/staff.view.history.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.log', {url:'/log', templateUrl:'views/staff.view.log.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.files', {url:'/files', templateUrl:'views/staff.view.files.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.edit', {url:'/edit', templateUrl: 'views/staff.edit.html', data:{activeMenu: 'staff'}})
答案 5 :(得分:1)
在“angular-ui-router”:“0.2.13”中,我认为@nfiniteloop的重定向解决方案不起作用。它曾经回滚到0.2.12(并且可能不得不在$ stateProvider之前调用$ urlRouterProvider.when吗?)
请参阅https://stackoverflow.com/a/26285671/1098564
和https://stackoverflow.com/a/27131114/1098564用于解决方法(如果您不想返回到0.2.12)
截至2014年11月28日,https://github.com/angular-ui/ui-router/issues/1584表示它应该在0.2.14
中再次发挥作用答案 6 :(得分:1)
这已经很晚了,但这里的所有答案都不适用于AngularJS的最新版本的angular-ui-router。从那个版本(特别是@uirouter/angularjs#v1.0.x开始,您可以将redirectTo: 'childStateName'
放在$stateProvider.state()
的第二个参数中。例如:
$stateProvider
.state('parent', {
resolve: {...},
redirectTo: 'parent.defaultChild'
})
.state('parent.defaultChild', {...})
以下是相关的文档部分:https://ui-router.github.io/guide/ng1/migrate-to-1_0#state-hook-redirectto
希望这有助于某人!
答案 7 :(得分:0)
这是一个非常简单透明的选择,只需修改ui路由器中的父状态:
.state('parent_state', {
url: '/something/:param1/:param2',
templateUrl: 'partials/something/parent_view.html', // <- important
controller: function($state, $stateParams){
var params = angular.copy($state.params);
if (params['param3'] === undefined) {
params['param3'] = 'default_param3';
}
$state.go('parent_state.child', params)
}
})
.state('parent_state.child', {
url: '/something/:param1/:param2/:param3',
templateUrl: '....',
controller: '....'
})
答案 8 :(得分:0)
添加angular-ui-router-default并将abstract
和default
选项添加到父状态:
...
.state('manager.staffDetail.view', {abstract: true, default: '.schedule', url:'/view', templateUrl: 'views/staff.details.html', data:{activeMenu: 'staff'}})
.state('manager.staffDetail.view.schedule', {url:'/schedule', templateUrl:'views/staff.view.schedule.html', data:{activeMenu: 'staff'}})
...
注意:要使其正常工作,父模板必须在其中的某个位置{。}}。