Подтвердить что ты не робот

Angular UI-маршрутизатор | $stateParams не работает

похоже, что $stateParams не работает. дату передачи следующим образом:

$state.go('state2', { someParam : 'broken magic' });

параметры игнорируются в целевом состоянии

console.log('state2 params:', $stateParams); // return empty object {}

код:

    var app = angular.module('app', [
     'ui.router'
    ]);

    app.config(function($stateProvider) {
      $stateProvider
            .state('state1', {
                url: '',
                templateUrl: 'state-1.html',
                controller : function ($scope, $state, $stateParams) {
                  $scope.go = function () {
                    $state.go('state2', { someParam : 'broken magic' });
                  };

                  console.log('state1 params:', $stateParams);
                }
            })
            .state('state2', {
                url: 'state2',
                templateUrl: 'state-2.html',
                controller : function ($scope, $state, $stateParams) {
                  $scope.go = function () {
                    $state.go('state1', { someOtherParam : 'lazy lizard' });
                  };

                  console.log('state2 params:', $stateParams);
                }
            });
    });

Живой пример можно найти здесь

спасибо.

4b9b3361

Ответ 1

Вы не можете передавать произвольные параметры между состояниями, вам нужно определить их как часть вашего определения $stateProvider. Например.

$stateProvider
    .state('contacts.detail', {
        url: "/contacts/:contactId",
        templateUrl: 'contacts.detail.html',
        controller: function ($stateParams) {
            console.log($stateParams);
        }
    }) ...

Вышеуказанный выведет объект с указанным свойством contactId. Если вы перейдете к /contacts/42, ваш $stateParams будет {contactId: 42}.

Для получения дополнительной информации см. документацию для маршрутизации URL-адресов UI-маршрутизатора.

Ответ 2

если вы не хотите определять свой параметр в URL-адресе, вы должны включить свойство params в состояние, к которому вы переходите. В противном случае данные будут удалены из объекта $stateParams. Формат объекта params - это массив строк в более старых версиях angular -ui-router; в новых версиях это объект пустых объектов:

params: { id: {}, blue: {}}

См. этот пример:

$stateProvider.state('state1', {
    url: '',
    params: {
        id: 0,
        blue: ''
    },
    templateUrl: 'state-1.html',
    controller: function($scope, $state, $stateParams) {
        $scope.go = function() {
            $state.go('state2', {
                id: 5,
                blue: '#0000FF'
            });
        };

        console.log('state params:', $stateParams);
    }
});

Связанный вопрос: Параметры для состояний без URL-адресов в ui-router для AngularJS

Ответ 3

Просто передать параметры в состояние недостаточно. Вы должны явно определить параметр по имени в свойстве url вашего состояния.

Если вы этого не сделаете, ui-router не будет знать, что это состояние ожидает параметр, а объект $stateParams не будет заполнен так, как вы хотите.

Вот пример того, как вы можете изменить свое состояние для ожидания параметра, ввести $stateParams и сделать что-то с указанным параметром:

$stateProvider.state('state1', {
        url: '',
        templateUrl: 'state-1.html',
        controller : function ($scope, $state, $stateParams) {
          $scope.params = $stateParams;
          $scope.go = function () {
            $state.go('state2', { id : 'broken magic' });
          };

          console.log('state1 params:', $stateParams);
        }
    })

    .state('state2', {
            url: 'state2/:id',
            templateUrl: 'state-2.html',
            controller : function ($scope, $state, $stateParams) {
              $scope.params = $stateParams;
              $scope.go = function () {
                $state.go('state1', { someOtherParam : 'lazy lizard' });
              };

              console.log('state2 params:', $stateParams);
            }
        })

Вот рабочий пример передачи параметров состояния на jsfiddle.

Ответ 4

приведенные выше решения, но для моего случая мне нужно было передать параметр запроса, поэтому я делаю это следующим образом:

$stateProvider
        .state('state1', {
            url: '/state1?other',
            templateUrl: 'state-1.html',
            controller : function ($scope, $state, $stateParams) {
              $scope.params = $stateParams;
              $scope.go = function () {
                $state.go('state2', { someParam : 'broken magic' });
              };

              console.log('state1 params:', $stateParams);
            }
        })
        .state('state2', {
            url: '/state2?someParam',
            templateUrl: 'state-2.html',
            controller : function ($scope, $state, $stateParams) {
              $scope.params = $stateParams;
              $scope.go = function () {
                $state.go('state1', { other : 'lazy lizard' });
              };

              console.log('state2 params:', $stateParams);
            }
        });

Ответ 5

Сделайте транспорт и используйте его!

angular_app.factory('$$transport', function($q) {
    var transport;
    return transport = {
        dfr: $q.defer(),
        push: function(v) {
            return transport.dfr.resolve(v);
        },
        then: function(s, f) {
            if (f == null) {
                f = function() {};
            }
            return transport.dfr.promise.then(function(_s) {
                s(_s);
                transport.dfr = $q.defer();
                return transport.then(s, f);
            }, function(_f) {
                f(_f);
                transport.dfr = $q.defer();
                return transport.then(s, f);
            });
        }
    };
});
$stateProvider.state('state1', {
            url: '/state1?other',
            templateUrl: 'state-1.html',
            controller : function ($scope, $state, $$transport) {
              $$transport.then(function(s) {
                $scope.param = s
                console.log('state1 params:', s);
              });
              $scope.go = function () {
                $state.go('state2', { someParam : 'broken magic' });
              }
            }
        })
        .state('state2', {
            url: '/state2?someParam',
            templateUrl: 'state-2.html',
            controller : function ($scope, $state, $$transport) {
              $scope.go = function () {
                $$transport.push({other:'lazy lizard'});
                $state.go('state1');
              };
            }
        });