角度UI路由器| $ stateParams不工作

Asa*_*atz 30 angularjs angular-ui-router

好像$stateParams不行.像这样传递日期:

$state.go('state2', { someParam : 'broken magic' });
Run Code Online (Sandbox Code Playgroud)

params在目标状态被忽略

console.log('state2 params:', $stateParams); // return empty object {}
Run Code Online (Sandbox Code Playgroud)

码:

    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);
                }
            });
    });
Run Code Online (Sandbox Code Playgroud)

可以在这里找到实例

谢谢.

kba*_*kba 63

您不能在状态之间传递任意参数,您需要将它们定义为定义的一部分$stateProvider.例如

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

上面将输出一个定义了contactId属性的对象.如果你去/contacts/42,你的$stateParams意志{contactId: 42}.

有关更多信息,请参阅UI-Router URL Routing文档.

  • 我刚刚遇到这个问题,它似乎是ui-router中的一个任意限制:http://bit.ly/1qbkhRq (3认同)
  • 我想传递实际状态,而不仅仅是文本字符串.有点难以在URL中做. (2认同)

小智 53

如果您不想在网址中定义参数,则必须在要转换的状态中包含params属性.否则,数据将从$ stateParams对象中删除.params对象的格式是旧版angular-ui-router中的字符串数组; 在较新的版本中,它是一个空对象的对象:

params: { id: {}, blue: {}}
Run Code Online (Sandbox Code Playgroud)

看这个例子:

$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);
    }
});
Run Code Online (Sandbox Code Playgroud)

相关问题: AngularJS的ui-router中没有URL的状态的参数

  • 此语法不适用于较新版本.你现在需要声明它``params:{someParam:{}}`.来源:http://stackoverflow.com/questions/22814554/parameters-for-states-without-urls-in-ui-router-for-angularjs文档仍然指出它应该是一个错误且非常混乱的数组. (7认同)
  • FYI您传递的空对象`blue:{}`被视为默认值.所以如果你在控制器中执行类似`if($ stateParams.blue)...`的操作,则传递`blue:null`. (4认同)
  • 这正是我所需要的 - 隐藏的参数未显示在URL中.我一直在搜索几天,但是在UI-Router文档中找不到这个.非常感谢! (2认同)
  • 注意:(在v0.2.10上)如果状态是具有URL参数的父级的子状态,则该参数需要包含在`params`数组中. (2认同)

Nic*_*ick 6

仅将参数传递给状态是不够的.您必须在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);
            }
        })
Run Code Online (Sandbox Code Playgroud)

这是一个在jsfiddle上传递状态参数的工作示例.