admin管理员组文章数量:1134246
I'm creating a tab based page which shows some data. I'm using UI-Router in AngularJs to register states.
My aim is to have one default tab open on page load. Each tab have sub tabs, and I would like to have a default sub tab open when changing tabs.
I was testing with onEnter
function and inside I'm using $state.go('mainstate.substate');
but it seems not to work due to loop effect issues (on state.go to substate it calls its parent state and so on, and it turns into a loop).
$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'}
})
Here I created a plunker demo.
For now everything works, except that I don't have the default tab open and that's exactly what I need.
Thank you for your suggestions, opinions and ideas.
I'm creating a tab based page which shows some data. I'm using UI-Router in AngularJs to register states.
My aim is to have one default tab open on page load. Each tab have sub tabs, and I would like to have a default sub tab open when changing tabs.
I was testing with onEnter
function and inside I'm using $state.go('mainstate.substate');
but it seems not to work due to loop effect issues (on state.go to substate it calls its parent state and so on, and it turns into a loop).
$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'}
})
Here I created a plunker demo.
For now everything works, except that I don't have the default tab open and that's exactly what I need.
Thank you for your suggestions, opinions and ideas.
Share Improve this question edited Feb 4, 2019 at 14:39 Adriaan Joubert 1951 gold badge4 silver badges15 bronze badges asked Apr 7, 2015 at 12:00 LeoLeo 5,7635 gold badges30 silver badges31 bronze badges6 Answers
Reset to default 173Update: 1.0 Onwards Supports redirectTo out of the box.
https://ui-router.github.io/ng1/docs/latest/interfaces/state.statedeclaration.html#redirectto
I created an example here.
This solution comes from a nice "Comment" to an an issue with redirection using .when()
(https://stackoverflow.com/a/27131114/1679310) and really cool solution for it (by Chris T, but the original post was by yahyaKacem)
https://github.com/angular-ui/ui-router/issues/1584#issuecomment-75137373
So firstly let's extend main with redirection setting:
$stateProvider
.state('main', {
url: '/main',
templateUrl: 'main.html',
redirectTo: 'main.street',
})
And add only this few lines into run
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'})
}
});
}]);
This way we can adjust any of our states with its default redirection...Check it here
EDIT: Added option from comment by @Alec to preserve the browser history.
In fact even if this solution proposed by Radim did exactly the job, I needed to remember every tab's sub tab (state).
So I found another solution which do the same thing but also remembers every tab substate.
I all have to do was to install ui-router-extras and use the deep state redirect feature:
$stateProvider
.state('main.street', {
url: '/main/street',
templateUrl: 'main.html',
deepStateRedirect: { default: { state: 'main.street.cloud' } },
});
Thank you!
As of version 1.0 of the ui-router it supports a redirectTo
property. For example:
.state('A', {
redirectTo: 'A.B'
})
Since version 1.0 of ui-router, a default hook has been introduced using IHookRegistry.onBefore() as demonstrated in the example Data Driven Default Substate in 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");
})
If someone comes here for an answer regarding how to implement a simple redirect for a state and, as it happened to me, doesn't have the opportunity to use the new router...
Obviously again if you can, @bblackwo answer is great:
$stateProvider.state('A', {
redirectTo: 'B',
});
If you can't then just manually redirect it:
$stateProvider.state('A', {
controller: $state => {
$state.go('B');
},
});
I hope it helps!
本文标签: javascriptRedirect a state to default substate with UIRouter in AngularJSStack Overflow
版权声明:本文标题:javascript - Redirect a state to default substate with UI-Router in AngularJS - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736854500a1955655.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论