Angular ui-router - how to access parameters in nested, named view, passed from the parent template?
Hi I am trying to access a parameter in the controller "ViewWorklogCrtl" while using ui-router and running into difficulty.
Basically, my parent template contains:
a(ui-sref="instance-ticket.worklog({id:{{ticket.testnum}}})") show
and then further down the page:
section(ui-view="top-section")
Then in my app.js, containing client-side routing info in short I have:
$stateProvider
.state('instance-ticket', {
url: '/ticket/:instanceID',
templateUrl: 'partials/instance-ticket',
controller: 'ViewTicketCrtl'
})
.state('instance-ticket.worklog', {
views:{
'top-section':{
templateUrl:'/partials/ticket.worklog.jade',
controller: 'ViewWorklogCrtl'
}
}
})
The template loading is working correctly, the issue and question I can't find an answer to is - how to access "testnum" being passed through the ui-sref link, to and within the ViewWorkLogCtrl... Is there a better approach to this?
Much thanks!!!
Solution 1:
The instanceID
is declared as an parameter, so we can access it like this
.controller('ViewWorklogCrtl',
[ '$scope','$stateParams'
function($scope , $stateParams ) {
//
$scope.instanceID = $stateParams.instanceID;
...
All the other details could be found here https://github.com/angular-ui/ui-router/wiki/URL-Routing
And the call to ui-sref
should be like this
<a ui-sref="instance-ticket.worklog({ instanceID:ticket.testnum })" >..
Extend:
In case that we would like to get two parameters, 1) instanceID from the parent 2) testnum from the current, we have to adjust the state defintion like this
.state('instance-ticket', {
url: '/ticket/:instanceID', // instanceID
templateUrl: 'partials/instance-ticket',
controller: 'ViewTicketCrtl'
})
.state('instance-ticket.worklog', {
// new param defintion
url: '/worklog/:testnum', // testnum
views:{
'top-section':{
templateUrl:'/partials/ticket.worklog.jade',
controller: 'ViewWorklogCrtl'
}
}
And the ui-sref
<a ui-sref="instance-ticket.worklog({ instanceID:1, ticket.testnum:2 })" >..
And we can access it like this:
.controller('ViewWorklogCrtl',
[ '$scope','$stateParams'
function($scope , $stateParams ) {
//
console.log($stateParams.instanceID)
console.log($stateParams.testnum)
...
Solution 2:
I have written a custom directive to solve this problem.
<a my-sref="{{myStateVar}}">awesome link</a>
You can clone it from Github: https://github.com/JensEger/Angular-Directives/tree/master/ui-router-helper