我在项目中使用有角度的ui路由器和嵌套路由,当我使用链接(ui-sref)导航到用户时,我遇到了一切都像魅力一样的问题&# 39; s详细页面,其中userId作为url的一部分。刷新页面时,缺少状态参数。
所以我已经看过角度演示:http://angular-ui.github.io/ui-router/sample/#/contacts/1/item/b并且无法重现这种行为,但是与我的应用程序相比,嵌套状态不是此演示的一部分。
$stateProvider
.state('base', {
abstract: true
})
.state('home', {
parent: 'base',
url: '/',
views: {
'content@': {
templateUrl: 'app/index/index.view.html',
controller: 'IndexController',
controllerAs: 'home'
}
}
})
.state('users', {
url: '/users',
parent: 'base',
abstract: true
})
.state('users.list', {
url: '/list',
views: {
'content@': {
templateUrl: 'app/users/users.list.html',
controller: 'UsersController',
controllerAs: 'users'
}
},
permissions: {
authorizedRoles: UserRoles.ALL_ROLES
}
})
.state('users.details', {
url: '/:userId/details',
views: {
'content@': {
templateUrl: 'app/users/user.details.html',
controller: 'UserDetailsController',
controllerAs: 'userDetails'
}
},
resolve: {
logSomeParams: ['$stateParams', '$state', function ($stateParams, $state) {
console.log($stateParams);
console.log(this);
console.log($state);
}]
}
})
刷新页面时,网址会立即更改为http://localhost:3000/#/users//details,控制台输出(解析功能)会显示缺少参数。
html5Mode(LocationProvider)未启用。我已经找到了"解决方案"如果页面刷新时缺少userId,则重定向回列表,但我不能相信没有更好的方法来解决这个问题。
这是我在概述中链接详细信息页面的方式(并且它正在运行):
<div class="panel-body" ui-sref="users.details({userId: user.siloUserId})">
答案 0 :(得分:2)
正如预期的那样,我的问题与ui-router无关。 URLMatcher按预期工作,即使你刷新页面(其他一切都是一个巨大的失望)。
但是,我有一个$ stateChangeStart监听器,它检查SAML身份验证会话(cookie)是否仍然有效并等待结果。
function(event, toState, toParams, fromState, fromParams){
if(!authenticationService.isInitialized()) {
event.preventDefault();
authenticationService.getDeferred().then(() => {
$state.go(toState);
});
} else {
//check authorization
if ( authenticationService.protectedState(toState) && !authenticationService.isAuthorized(toState.permissions.authorizedRoles)) {
authenticationService.denyAccess();
event.preventDefault();
}
}
}
不知道如何发生这种情况,但我忘了将参数传递给stateProvider的go方法。所以我不得不改变的是添加参数:
$state.go(toState, toParams);