Как перевести объект в состояние с помощью UI-роутера?
Я хотел бы иметь возможность перейти в состояние и передать произвольный объект с помощью ui-router.
Мне известно, что обычно используется $stateParams
, но я считаю, что это значение вставляется в URL, и я не хочу, чтобы пользователи могли добавлять эти данные в закладки.
Я хотел бы сделать что-то вроде этого.
$state.transitionTo('newState', {myObj: {foo: 'bar'}});
function myCtrl($stateParams) {
console.log($stateParams.myObj); // -> {foo: 'bar'}
};
Есть ли способ сделать это без кодирования значений в URL?
Ответы
Ответ 1
В версии 0.2.13 вы должны иметь возможность передавать объекты в $state.go,
$state.go('myState', {myParam: {some: 'thing'}})
$stateProvider.state('myState', {
url: '/myState/{myParam:json}',
params: {myParam: null}, ...
и затем получить доступ к параметру в вашем контроллере.
$stateParams.myParam //should be {some: 'thing'}
myParam не будет отображаться в URL-адресе.
Источник:
Смотрите комментарий от christopherthielen https://github.com/angular-ui/ui-router/issues/983, воспроизведенный здесь для удобства:
christopherthielen: Да, теперь это должно работать в 0.2.13.
.state('foo', {url: '/foo/: param1? param2', params: {param3: null}//null - значение по умолчанию});
$state.go('foo', {param1: 'bar', param2: 'baz', param3: {id: 35, name: 'what'}});
$stateParams в 'foo' теперь {param1: 'bar', param2: 'baz', param3: { id: 35, name: 'what'}}
url is/foo/bar? param2 = baz.
Ответ 2
Есть две части этой проблемы:
1), используя параметр, который не изменит URL (с использованием свойства params):
$stateProvider
.state('login', {
params: [
'toStateName',
'toParamsJson'
],
templateUrl: 'partials/login/Login.html'
})
2) передача объекта в качестве параметра:
Нет, прямо, как это сделать сейчас, поскольку каждый параметр преобразуется в строку ( РЕДАКТИРОВАТЬ: с 0.2.13 это больше не верна - вы можете напрямую использовать объекты), но вы можете обойти это, создав строку самостоятельно
toParamsJson = JSON.stringify(toStateParams);
и в целевом контроллере снова десериализуйте объект
originalParams = JSON.parse($stateParams.toParamsJson);
Ответ 3
Собственно вы можете это сделать.
$state.go("state-name", {param-name: param-value}, {location: false, inherit: false});
Это официальная документация о вариантах в state.go
Все описано там, и, как вы видите, это способ сделать.
Ответ 4
Btw вы также можете использовать атрибут ui-sref в своих шаблонах для передачи объектов
ui-sref="myState({ myParam: myObject })"
Ответ 5
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));
})
Ответ 6
Нет, URL-адрес всегда будет обновляться, когда параметры передаются на transitionTo
.
Это происходит на state.js: 698 в ui-router.