J'aimerais pouvoir passer à un état et passer un objet arbitraire à l'aide de ui-router.
Je suis conscient du fait que $stateParams
est généralement utilisé, mais je crois que cette valeur est insérée dans l'URL et je ne souhaite pas que les utilisateurs puissent ajouter un signet à ces données.
J'aimerais faire quelque chose comme ça.
$state.transitionTo('newState', {myObj: {foo: 'bar'}});
function myCtrl($stateParams) {
console.log($stateParams.myObj); // -> {foo: 'bar'}
};
Y a-t-il un moyen de faire cela sans coder les valeurs dans l'URL?
Dans la version 0.2.13, vous devriez pouvoir passer des objets dans $ state.go,
$state.go('myState', {myParam: {some: 'thing'}})
$stateProvider.state('myState', {
url: '/myState/{myParam:json}',
params: {myParam: null}, ...
puis accédez au paramètre dans votre contrôleur.
$stateParams.myParam //should be {some: 'thing'}
myParam n'apparaîtra pas dans l'URL.
La source:
Voir le commentaire de christopherthielen https://github.com/angular-ui/ui-router/issues/98 , reproduit ici pour plus de commodité:
christopherthielen: Oui, cela devrait fonctionner maintenant dans 0.2.13.
.state ('foo', {url: '/ foo /: param1? param2', params: {param3: null} // null est la valeur par défaut});
$ state.go ('foo', {param1: 'bar', param2: 'baz', param3: {id: 35, nom: 'quoi'}});
$ stateParams dans 'foo' est maintenant {param1: 'bar', param2: 'baz', param3: {id: 35, nom: 'quoi'}}
l'URL est/foo/bar? param2 = baz.
Il y a deux parties à ce problème
1) en utilisant un paramètre qui ne modifierait pas une URL (en utilisant la propriété params):
$stateProvider
.state('login', {
params: [
'toStateName',
'toParamsJson'
],
templateUrl: 'partials/login/Login.html'
})
2) passer un objet en paramètre: Eh bien, il n'y a pas de façon directe de le faire maintenant car chaque paramètre est converti en chaîne (EDIT: depuis 0.2.13, ce n'est plus vrai - vous pouvez utiliser des objets directement), mais vous pouvez contourner le problème en créant la chaîne vous-même.
toParamsJson = JSON.stringify(toStateParams);
et dans le contrôleur cible désérialiser l'objet à nouveau
originalParams = JSON.parse($stateParams.toParamsJson);
En fait, vous pouvez le faire.
$state.go("state-name", {param-name: param-value}, {location: false, inherit: false});
Ceci est la documentation officielle sur les options dans state.go
Tout y est décrit et comme vous pouvez le constater, c’est la voie à suivre.
En outre, vous pouvez également utiliser l'attribut ui-sref dans vos modèles pour transmettre des objets
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));
})
Non, l'URL sera toujours mise à jour lorsque les paramètres seront passés à transitionTo
.
Cela se produit sur state.js: 698 dans i-router .