AngularJS: Passa um object para um estado usando o ui-roteador

Eu gostaria de poder fazer a transição para um estado e passar um object arbitrário usando o roteador-ui.

Estou ciente de que geralmente $ stateParams é usado, mas acredito que esse valor seja inserido no URL e não quero que os usuários possam marcar esses dados.

Eu gostaria de fazer algo assim.

$state.transitionTo('newState', {myObj: {foo: 'bar'}}); function myCtrl($stateParams) { console.log($stateParams.myObj); // -> {foo: 'bar'} }; 

Existe uma maneira de fazer isso sem codificar valores na URL?

Na versão 0.2.13, você deve conseguir passar objects para $ state.go,

 $state.go('myState', {myParam: {some: 'thing'}}) $stateProvider.state('myState', { url: '/myState/{myParam:json}', params: {myParam: null}, ... 

e depois acessar o parâmetro no seu controlador.

 $stateParams.myParam //should be {some: 'thing'} 

myParam não aparecerá no URL.

Fonte:

Veja o comentário de christopherthielen https://github.com/angular-ui/ui-router/issues/983 , reproduzido aqui por conveniência:

christopherthielen: Sim, isso deve estar funcionando agora em 0.2.13.

.state (‘foo’, {url: ‘/ foo /: param1? param2’, parâmetros: {param3: null} // null é o valor padrão});

$ state.go (‘foo’, {param1: ‘bar’, param2: ‘baz’, param3: {id: 35, nome: ‘o que’}});

$ stateParams em ‘foo’ agora é {param1: ‘bar’, param2: ‘baz’, param3: {id: 35, nome: ‘o que’}}

url é / foo / bar? param2 = baz.

Existem duas partes deste problema

1) usando um parâmetro que não alteraria uma URL (usando a propriedade params):

 $stateProvider .state('login', { params: [ 'toStateName', 'toParamsJson' ], templateUrl: 'partials/login/Login.html' }) 

2) passando um object como parâmetro: Bem, não há nenhuma maneira direta como fazê-lo agora, como cada parâmetro é convertido em string ( EDIT : desde 0.2.13, isso não é mais verdade – você pode usar objects diretamente), mas você pode contornar isso criando a string por conta própria

 toParamsJson = JSON.stringify(toStateParams); 

e no controlador de destino desserializar o object novamente

 originalParams = JSON.parse($stateParams.toParamsJson); 

Na verdade você pode fazer isso.

 $state.go("state-name", {param-name: param-value}, {location: false, inherit: false}); 

Esta é a documentação oficial sobre as opções no estado.go

Tudo é descrito lá e como você pode ver, este é o caminho a ser feito.

Btw você também pode usar o atributo ui-sref em seus modelos para passar objects

 ui-sref="myState({ myParam: myObject })" 

1)

 $stateProvider .state('app.example1', { url: '/example', views: { 'menuContent': { templateUrl: 'templates/example.html', controller: 'ExampleCtrl' } } }) .state('app.example2', { url: '/example2/:object', views: { 'menuContent': { templateUrl: 'templates/example2.html', controller: 'Example2Ctrl' } } }) 

2)

 .controller('ExampleCtrl', function ($state, $scope, UserService) { $scope.goExample2 = function (obj) { $state.go("app.example2", {object: JSON.stringify(obj)}); } }) .controller('Example2Ctrl', function ($state, $scope, $stateParams) { console.log(JSON.parse($state.params.object)); }) 

Não, a URL sempre será atualizada quando os parâmetros forem passados ​​para transitionTo .

Isso acontece no state.js: 698 no roteador ui .