I'm wondering if it's possible to have a nested state without a nested view. Suppose I have this setup:
App.config(function($stateProvider, $urlRouterProvider) {
//
//
// Now set up the states
$stateProvider
.state('index', {
url: "/index",
templateUrl: "views/home.html",
controller: "MainController",
ncyBreadcrumb: {
label: 'Home'
}
})
.state('About', {
url: "/about",
templateUrl: "views/about.html",
controller: "AboutController",
ncyBreadcrumb: {
label: 'About',
parent: 'index'
}
})
.state('us', {
url: "/us",
templateUrl: "views/us.html",
controller: "UsController",
parent: 'about',
ncyBreadcrumb: {
label: 'Us'
}
})
//
// For any unmatched url, redirect to /home
$urlRouterProvider.otherwise("/index");
});
When I visit /about
, I get the about page. When I visit /about/us
, I still get the about page with the us page loaded in the ui-view
of the about page. However, what I would like to do is load the about page on /about
and just the us page on /us
. Is this possible?
Yes it is possible. What we have to use, is the absolute naming. State defintion would look like this:
See doc:
View Names - Relative vs. Absolute Names
So as documentation shows, we can use absolute naming. In our case, we will target root state which nams is string empty (index.html) - the part after delimiter @. And it is unnamed view - string Empty before @. That is why we use:
NOTE: behind the scenes,
UI-Router
used this for stateus
:There is a working plunker, with these states in action:
Check it in action that if the 'us' is a state name the ui-sref="us" will properly navigate to
'/about/us'
.Sure, just because a state shares part of the url doesn't mean it has to be a parent/child relationship. Just set the
us
state's url to/about/us
and don't give it a parent.