我正在测试UI-Router
嵌套状态,但我无法在父/子场景中设置默认状态,请提供帮助。
库:
导航路径:
/ - home
/settings - parent state/page
/settings.default - child 1
/settings.mail - child 2
/settings.phone - child 3
预期行为:
导航到/settings
时,应触发/加载默认子级“常规”状态/页面
实际行为:
如果我将'settings'状态设置为'abstrat:true',则会出现错误:
Error: Cannot transition to abstract state 'settings'
at Object.transitionTo (angular-ui-router.js:3143)
at Object.go (angular-ui-router.js:3068)
at angular-ui-router.js:4181
at angular.js:16299
at completeOutstandingRequest (angular.js:4924)
at angular.js:5312
如果我删除'abstrat:true',则没有错误,但是当我导航到/ settings时,默认子状态/页面 - 一般状态未触发,settings.html显示但未加载
app.js:
angular.module('test',['ui.router','sails.io']) //config routing
.config(['$stateProvider','$urlRouterProvider','$locationProvider',
function($stateProvider,$urlRouterProvider,$locationProvider) {
$urlRouterProvider.otherwise('/');
$locationProvider.html5Mode(true);
$stateProvider
.state('home', {
url: '/',
templateUrl: 'views/index.html',
controller: 'IndexController'
})
.state('settings', {
abstract: true,
url: '/settings',
templateUrl: 'views/settings.html',
controller: 'SettingsController'
})
.state('settings.general', {
url: '',
templateUrl: 'views/settings/general.html',
controller: 'SettingsController'
})
.state('settings.mail', {
url: '/mail',
templateUrl: 'views/settings/mail.html',
controller: 'SettingsController'
})
.state('settings.phone', {
url: '/phone',
templateUrl: 'views/settings/phone.html',
controller: 'SettingsController'
});
}]);
视图/ settings.html
<div class="container">
<div class="row">
<div class="col-md-3">
<ul class="list-group">
<li class="list-group-item"><a ui-sref=".general">General</a></li>
<li class="list-group-item"><a ui-sref=".phone">Phone</a></li>
<li class="list-group-item"><a ui-sref=".mail">Mail</a></li>
</ul>
</div>
<div class="col-md-9">
<div ui-view></div>
</div>
</div>
</div>
答案 0 :(得分:9)
这可行,但只需使用enum
导航,即 url
:
href
但这不会 - 我们无法前往 <a href="/settings"> // will work
州:
abstract
但基于此Q&amp;答:
我们可以删除抽象并创建这样的默认状态处理。有updated plunker
<a ui-sref="settings">settings</a>
父级统计调整:
// redirection engine
app.run(['$rootScope', '$state', function($rootScope, $state) {
$rootScope.$on('$stateChangeStart', function(evt, to, params) {
if (to.redirectTo) {
evt.preventDefault();
$state.go(to.redirectTo, params)
}
});
}]);
检查here
答案 1 :(得分:1)
我意识到这是一个较老的问题,但我想我会添加一些东西,以防它帮助其他人:
虽然您可能不想添加插件来解决此问题,但您应该查看UI-Router-Extras
其中包含一项名为“Deept State Redirect”的功能。这允许任何状态保存最近激活的子状态,这样当您转换开,然后返回时,相同的子状态(子状态)将处于活动状态。
可以帮助您解决问题的部分是能够定义默认子状态。您可以通过添加“dsr”参数并将“default”设置为您的子状态来执行此操作。
function myRouterConfig ($stateProvider, $urlRouterProvider) {
$stateProvider
.state('parentState', {
//Not in this file
parent: 'index',
sticky: true,
//ui-router-extras deepStateRedirect option
dsr: {
default: 'parentState.defaultChild'
},
url: '/parentState',
views: {
'main@index': {
template: '<my-parentStateComponent>'
}
}
})
.state('parentState.defaultChild', {
url: '/defaultChild',
views: {
'child@parentState': {
template: '<my-defaultChildComponent>'
}
}
});
}