How to send and retrieve parameters using $state.go toParams and $stateParams? How to send and retrieve parameters using $state.go toParams and $stateParams? angularjs angularjs

How to send and retrieve parameters using $state.go toParams and $stateParams?


If you want to pass non-URL state, then you must not use url when setting up your state. I found the answer on a PR and did some monkeying around to better understand.

$stateProvider.state('toState', {  templateUrl:'wokka.html',  controller:'stateController',  params: {    'referer': 'some default',     'param2': 'some default',     'etc': 'some default'  }});

Then you can navigate to it like so:

$state.go('toState', { 'referer':'jimbob', 'param2':37, 'etc':'bluebell' });

Or:

var result = { referer:'jimbob', param2:37, etc:'bluebell' };$state.go('toState', result);

And in HTML thusly:

<a ui-sref="toState(thingy)" class="list-group-item" ng-repeat="thingy in thingies">{{ thingy.referer }}</a>

This use case is completely uncovered in the documentation, but I think it's a powerful means on transitioning state without using URLs.


The Nathan Matthews's solution did not work for me but it is totally correct but there is little point to reaching a workaround:

The key point is: Type of defined parameters and toParamas of $state.go should be same array or object on both sides of state transition.

For example when you define a params in a state as follows you means params is array because of using "[]":

$stateProvider.state('home', {    templateUrl: 'home',    controller:  'homeController'}).state('view', {    templateUrl: 'overview',    params:      ['index', 'anotherKey'],    controller:  'overviewController'})

So also you should pass toParams as array like this:

params = { 'index': 123, 'anotherKey': 'This is a test' }paramsArr = (val for key, val of params)$state.go('view', paramsArr)

And you can access them via $stateParams as array like this:

app.controller('overviewController', function($scope, $stateParams) {    var index = $stateParams[0];    var anotherKey = $stateParams[1];});

Better solution is using object instead of array in both sides:

$stateProvider.state('home', {    templateUrl: 'home',    controller:  'homeController'}).state('view', {    templateUrl: 'overview',    params:      {'index': null, 'anotherKey': null},    controller:  'overviewController'})

I replaced [] with {} in params definition. For passing toParams to $state.go also you should using object instead of array:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })

then you can access them via $stateParams easily:

app.controller('overviewController', function($scope, $stateParams) {    var index = $stateParams.index;    var anotherKey = $stateParams.anotherKey;});


All I had to do was add a parameter to the url state definition like so

url: '/toState?referer'

Doh!