使用AngularJS中的UI路由器将状态重定向到默认子状态
Redirect a state to default substate with UI-Router in AngularJS
我正在创建一个基于选项卡的页面,其中显示一些数据。我在AngularJs中使用UI路由器来注册状态。
我的目标是在页面加载时打开一个默认选项卡。每个选项卡都有子选项卡,我希望在更改选项卡时打开一个默认的子选项卡。
我用onEnter
函数进行了测试,在内部我使用$state.go('mainstate.substate');
,但由于循环效应问题,它似乎不起作用(在state.go上,它调用其父状态等等,然后它变成了一个循环)。
$stateProvider
.state('main', {
url: '/main',
templateUrl: 'main.html',
onEnter: function($state) {
$state.go('main.street');
}
})
.state('main.street', {
url: '/street',
templateUrl: 'submenu.html',
params: {tabName: 'street'}
})
在这里,我创建了一个plunker演示。
目前一切正常,只是我没有打开默认选项卡,这正是我所需要的。
感谢您的建议、意见和想法。
更新:1.0向前支持开箱即用的重定向。
https://ui-router.github.io/ng1/docs/latest/interfaces/state.statedeclaration.html#redirectto
我在这里创建了一个示例。
这个解决方案来自于对使用.when()
重定向的问题的一个很好的"注释"(https://stackoverflow.com/a/27131114/1679310)和真的很酷的解决方案(由Chris T撰写,但原始帖子由yahyaKacem撰写)
https://github.com/angular-ui/ui-router/issues/1584#issuecomment-75137373
因此,首先让我们用重定向设置扩展main:
$stateProvider
.state('main', {
url: '/main',
templateUrl: 'main.html',
redirectTo: 'main.street',
})
并且只将这几行添加到运行中
app.run(['$rootScope', '$state', function($rootScope, $state) {
$rootScope.$on('$stateChangeStart', function(evt, to, params) {
if (to.redirectTo) {
evt.preventDefault();
$state.go(to.redirectTo, params, {location: 'replace'})
}
});
}]);
通过这种方式,我们可以通过其默认重定向来调整我们的任何状态。。。在这里查看
编辑:添加了@Alec评论中的选项,以保留浏览器历史记录。
事实上,即使Radim提出的这个解决方案确实完成了任务,我也需要记住每个选项卡的子选项卡(状态)。
所以我找到了另一个解决方案,它可以做同样的事情,但也能记住每个选项卡的子状态。
我所要做的就是安装额外的ui路由器并使用深度状态重定向功能:
$stateProvider
.state('main.street', {
url: '/main/street',
templateUrl: 'main.html',
deepStateRedirect: { default: { state: 'main.street.cloud' } },
});
谢谢!
从ui路由器的1.0版本开始,它支持redirectTo
属性。例如:
.state('A', {
redirectTo: 'A.B'
})
自ui路由器的1.0版本以来,已经使用IHookRegistry.onBefore()引入了默认挂钩,如中的示例Data Driven default Substate所示http://angular-ui.github.io/ui-router/feature-1.0/interfaces/transition.ihookregistry.html#onbefore
// state declaration
{
name: 'home',
template: '<div ui-view/>',
defaultSubstate: 'home.dashboard'
}
var criteria = {
to: function(state) {
return state.defaultSubstate != null;
}
}
$transitions.onBefore(criteria, function($transition$, $state) {
return $state.target($transition$.to().defaultSubstate);
});
app.config(function($stateProvider,$urlRouterProvider){
$urlRouterProvider.when("/state","/state/sub-state");
})
如果有人来这里寻求关于如何实现一个状态的简单重定向的答案,而我却没有机会使用新路由器。。。
显然,如果可以的话,@bblackwo的回答很好:
$stateProvider.state('A', {
redirectTo: 'B',
});
如果你不能,那么只需手动重定向:
$stateProvider.state('A', {
controller: $state => {
$state.go('B');
},
});
我希望它能有所帮助!
- 使用AngularJS中的UI路由器将状态重定向到默认子状态
- AngularJS$http重定向状态代码
- AngularJS - ui.router - 如何在动态添加它们后重定向到所需的状态
- 如何侦听跨域映像请求上的任何301/302重定向状态代码
- 根据React中的状态重定向用户
- 如果未处于登录状态,如何重定向到登录页面,登录后重定向到原始页面
- 重定向并显示警报(如果处于隐身状态)
- AngularJs $http postsuccessCallback 导致页面重定向,即使服务器以 200 状态响应也
- UI 路由器不断重定向到索引,并且不加载状态/视图
- 如何重定向状态子 UI 路由器
- PassportJS - 动态设置状态以允许在回调时重定向
- 推送状态上的角度重定向
- 在 ASP 中处于非活动状态后使用 Session.Timeout 重定向
- 在React中,我如何将用户重定向回状态已更改的索引
- Javascript窗口重定向在chrome中不起作用((取消)-状态)
- JQGRID-保持复选框选择状态-页面刷新/重定向/重新加载
- 当在主干中使用推送状态重定向时,我如何保持“返回”?按钮工作
- 否则,在单元测试中,$urlRouterProvider会重定向到不该重定向的状态
- 如何使用javascript从html登录表单重定向到欢迎页面?该网站处于脱机状态,并且位于开发服务器上
- 重定向问题使用推送状态/弹出状态-与javascript