I'm trying to implement a language switcher where if a user clicks on "de" from any given page on an "en" side - it takes them to that page of the "de" side. If I console.dir the $state parameter, it exposes the values I'd want with the "current" property of the given $state. If I try to console.dir the $state.current to focus on the values I want, it only gives the parent state property (my current views are nested).
My current thinking is, I'm on url/en/content, and dynamically I can then have my lang navigation dynamically load the appropriate destination points into some kind of data attribute, pick those up with a custom directive where I'd initiate a "go to" and set my preferedLanguage value per angular-translate.
The key issue at the moment is exposing that $state name - again, when simply browsing $state the current object gives the values I'd want, but $current.state directly only gives the parent state.
If anyone has a better suggestion of how to do this (in a angular way - no custom cookie junk) I'm happy to take suggestions.
Thanks!
Update! CODE SAMPLES:
Object reference of my states:
var urlStates = {
en: {
home: {
name: 'home',
url: '/en',
templateUrl: 'templates/'+lang+'/home.html',
abstract: 'true'
},
home_highlights: {
name:'home.highlights',
url: '',
templateUrl: 'templates/'+lang+'/home.highlights.html'
},
home_social:
{
name: 'home.social',
url: '/social',
templateUrl: 'templates/'+lang+'/home.social.html'
},
home_map:
{
name: 'home.map',
url: '/map',
templateUrl: 'templates/'+lang+'/home.map.html'
}
};
My States:
$stateProvider
.state(urlStates.en.home)
.state(urlStates.en.home_highlights)
.state(urlStates.en.home_social)
.state(urlStates.en.home_map);
$locationProvider.html5Mode(true);
})
Controller:
.controller('LandingPage', function($translate, $state){
this.state = $state;
this.greeting = "Hello";
});
And Lastly, the output I see in the dom:
With this.state = $state;
{
"params": {},
"current": {
"name": "home.highlights",
"url": "",
"templateUrl": "templates/en/home.highlights.html" },
"transition": null
}
With this.state = $state.current
{
"name": "",
"url": "^",
"views": null,
"abstract": true
}
In my current project the solution looks like this:
I created an abstract Language State
Every state in the project has to depend on this state
The language switch buttons calls a custom function:
And the corresponding function looks like this (inside a controller of course):
This works, but there is a nicer solution just changing a value in the state params from html:
Unfortunately this does not work, see https://github.com/angular-ui/ui-router/issues/1031
Its just because of the load time angular takes to give you the current state.
If you try to get the current state by using
$timeout
function then it will give you correct result in$state.current.name
I wrapped around
$state
around$timeout
and it worked for me.For example,
this is how I do it
JAVASCRIPT:
HTML:
EXAMPLE
http://plnkr.co/edit/LGMZnj?p=preview
Use Timeout
See - https://github.com/angular-ui/ui-router/issues/1627
Answering your question in this format is quite challenging.
On the other hand you ask about navigation and then about current
$state
acting all weird.For the first I'd say it's too broad question and for the second I'd say... well, you are doing something wrong or missing the obvious :)
Take the following controller:
Where
app
is configured as:Then simple HTML template having
Would "print out" e.g. the following
I put up a small example showing this, using
ui.router
andpascalprecht.translate
for the menus. I hope you find it useful and figure out what is it you are doing wrong.Plunker here http://plnkr.co/edit/XIW4ZE
Screencap