AngularJS: передача объекта в состояние с помощью ui-маршрутизатора

Я хотел бы иметь возможность перейти в состояние и передать произвольный объект с помощью ui-router.

Я знаю, что обычно используется $stateParams, но я считаю, что это значение вставлено в URL-адрес, и я не хочу, чтобы пользователи могли добавлять закладки в эти данные.

Я хотел бы сделать что-то вроде этого.

$state.transitionTo('newState', {myObj: {foo: 'bar'}});

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

есть ли способ сделать это без кодирования значений в URL-адрес?

6 ответов


в версии 0.2.13 вы должны иметь возможность передавать объекты в $state.иди,

$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.

.государство (с'Foo', { URL-адрес: '/фу/:параметр1?параметр param2', слово params: { param3: null } / / null-значение по умолчанию});

$государство.идти (с'Foo', { параметр1: 'бар', параметр2: 'баз', param3: { идентификатор: 35, название: 'какой' } });

$stateParams в ' foo 'теперь { param1: 'bar', param2: 'baz', param3: { id: 35, name: 'what'} }

url is /foo / bar?параметр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);

на самом деле вы можете сделать это.

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

это официальная документация о вариантах в состоянии.go

все описано там, и, как вы можете видеть, это способ сделать.


Btw вы также можете использовать атрибут ui-sref в своих шаблонах для передачи объектов

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


    })

нет, URL-адрес всегда будет обновляться при передаче параметров в transitionTo.

это произойдет на государство.js: 698 на ui-router.