AngularJS: passa un object in uno stato usando ui-router

Mi piacerebbe essere in grado di passare a uno stato e un passaggio di un object arbitrario usando ui-router.

Sono consapevole del fatto che di solito viene utilizzato $ stateParams, ma credo che questo valore sia inserito nell’URL e non voglio che gli utenti siano in grado di aggiungere questi dati ai segnalibri.

Mi piacerebbe fare qualcosa di simile.

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

C’è un modo per farlo senza codificare i valori nell’URL?

Nella versione 0.2.13, dovresti essere in grado di passare oggetti in $ state.go,

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

e quindi accedere al parametro nel controller.

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

myParam non verrà visualizzato nell’URL.

Fonte:

Vedere il commento di christopherthielen https://github.com/angular-ui/ui-router/issues/983 , qui riprodotto per comodità:

christopherthielen: Sì, dovrebbe funzionare ora in 0.2.13.

.state (‘foo’, {url: ‘/ foo /: param1? param2’, params: {param3: null} // null è il valore predefinito});

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

$ stateParams in ‘foo’ ora è {param1: ‘bar’, param2: ‘baz’, param3: {id: 35, nome: ‘what’}}

url is / foo / bar? param2 = baz.

Ci sono due parti di questo problema

1) utilizzando un parametro che non altera un url (usando la proprietà params):

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

2) passare un object come parametro: Beh, non esiste un modo diretto come farlo ora, dato che ogni parametro è convertito in stringa ( EDIT : dal 0.2.13, questo non è più vero – puoi usare direttamente gli oggetti), ma puoi risolverlo creando la stringa da solo

 toParamsJson = JSON.stringify(toStateParams); 

e nel controller di destinazione deserializzare nuovamente l’object

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

In realtà puoi farlo.

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

Questa è la documentazione ufficiale sulle opzioni in state.go

Tutto è descritto lì e come puoi vedere questo è il modo di essere fatto.

Inoltre puoi usare l’attributo ui-sref nei tuoi modelli per passare oggetti

 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)); }) 

No, l’URL verrà sempre aggiornato quando i parametri vengono passati a transitionTo .

Questo succede su state.js: 698 in ui-router .