如何使用$ state.go toParams和$ stateParams发送和检索参数?


123

我正在将AngularJS v1.2.0-rc.2与ui-router v0.2.0一起使用。我想将引荐来源网址状态传递给另一个状态,因此我使用的toParams方式$state.go如下:

$state.go('toState', {referer: $state.current.name});

根据文档,这应该$stateParamstoState控制器上填充,但它是undefined。我想念什么?

我创建了一个小例子来演示:

http://plnkr.co/edit/ywEcG1

Answers:


147

如果要传递非URL状态,则url在设置时一定不要使用state。我在PR上找到了答案,并四处游逛以更好地理解。

$stateProvider.state('toState', {
  templateUrl:'wokka.html',
  controller:'stateController',
  params: {
    'referer': 'some default', 
    'param2': 'some default', 
    'etc': 'some default'
  }
});

然后,您可以像这样导航到它:

$state.go('toState', { 'referer':'jimbob', 'param2':37, 'etc':'bluebell' });

要么:

var result = { referer:'jimbob', param2:37, etc:'bluebell' };
$state.go('toState', result);

因此,在HTML中:

<a ui-sref="toState(thingy)" class="list-group-item" ng-repeat="thingy in thingies">{{ thingy.referer }}</a>

该用例已在文档中完全揭露,但是我认为这是在不使用URL的情况下进行状态转换的强大方法。


2
注意:(在v0.2.10上)如果状态是具有URL参数的父级的子状态,则该参数需要包含在params数组中。
ivarni 2014年

5
当我在状态定义中将参数列为数组时,出现错误消息“ Missing required parameter”。而是将其列为哈希,例如{referer: true, param2: true, etc: true}
Dave Ceddia

1
在最新的v0.2.13中,这对我不起作用。也许,由于某种原因,它没有记载。
demisx 2015年

1
最近,您需要将params更改为对象。如此参数:{myParam:{值:defaultValue / undefined }}
rbnzdave

2
如何获取控制器中的数据?
Shylendra Madda'8

47

内森·马修斯(Nathan Matthews)的解决方案对我不起作用,但这是完全正确的,但没有解决的办法:

关键点是:$ state.go的已定义参数和toParamas的类型在状态转换的两侧应为相同的数组或对象。

例如,当您按如下所示在状态中定义参数时,则表示参数是数组,因为使用了[[]]:

$stateProvider
.state('home', {
    templateUrl: 'home',
    controller:  'homeController'
})
.state('view', {
    templateUrl: 'overview',
    params:      ['index', 'anotherKey'],
    controller:  'overviewController'
})

因此,您也应该像这样将toParams作为数组传递:

params = { 'index': 123, 'anotherKey': 'This is a test' }
paramsArr = (val for key, val of params)
$state.go('view', paramsArr)

您可以通过$ stateParams作为数组访问它们,如下所示:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams[0];
    var anotherKey = $stateParams[1];
});

更好的解决方案是在两侧都使用对象而不是数组

$stateProvider
.state('home', {
    templateUrl: 'home',
    controller:  'homeController'
})
.state('view', {
    templateUrl: 'overview',
    params:      {'index': null, 'anotherKey': null},
    controller:  'overviewController'
})

我在参数定义中将{]替换为{}。为了将toParams传递给$ state.go,您还应该使用object而不是array:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })

那么您可以通过$ stateParams轻松访问它们:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams.index;
    var anotherKey = $stateParams.anotherKey;
});

绝对可以,并且我已经在项目中使用了它。你测试了吗?如果您进行测试,请告诉我这个问题。
Reza Rahimi 2014年

1
它不是对象格式{'index','anotherKey'},这怎么工作?我试过了 没用
maxisam 2014年

输入您的代码段,版本或可以帮助解决问题的内容。我使用了以下版本:AngularJS v1.2.26,ui-router v0.2.11,CoffeeScript我也使用了Bower的版本。
Reza Rahimi

3
这行得通,但是用其他方式代替params: {'index', 'anotherKey'},params: {'index' : 'dummy', 'anotherKey' : 'dummy'},则它不是有效的javascript对象
ps0604 2014年

28

我要做的就是像这样向url状态定义添加一个参数

url: '/toState?referer'

h!


我可以使它与/toState/:referer语法一起使用的唯一方法是使用$location.path()而不是$state.go()
nshew 2014年

您没有找到使用ui-router功能的其他解决方案吗?
杰森

有一种方法可以使它与$ state.go()一起使用。花了我一些时间来纠正它。在这里查看我的示例。
mbokil

有效。但是,如果要传递两个参数,可能还不清楚。因此,以下代码可以解决问题。网址:“ / contacts?myParam1&myParam2”
eduardo92 '18年

15

不知道它是否可以与带有ui-router v0.2.0的AngularJS v1.2.0-rc.2一起使用。我已经在ui-router v0.2.13的AngularJS v1.3.14上测试了该解决方案。

我只是意识到,不必像gwhn建议的那样在URL中传递参数。

只需在状态定义中添加具有默认值的参数即可。您的状态仍然可以具有Url值。

$stateProvider.state('state1', {
    url : '/url',
    templateUrl : "new.html",
    controller : 'TestController',
    params: {new_param: null}
});

并将参数添加到 $state.go()

$state.go('state1',{new_param: "Going places!"});


柯尔...你救了我的老兄!简单直接的解决方案。
Nowdeen

15

此页面上的这些示例都不适合我。这是我使用过的,效果很好。一些解决方案说您不能将url与$ state.go()结合使用,但这是不正确的。尴尬的是,您必须为url定义参数,并列出这些参数。两者都必须存在。在Angular 1.4.8和UI Router 0.2.15上进行了测试。

状态中,将参数添加到状态结尾并定义参数:

url: 'view?index&anotherKey',
params: {'index': null, 'anotherKey': null}

在您的控制器中, go语句将如下所示:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' });

然后将参数拉出并在新状态的控制器中使用它们(不要忘记将$ stateParams传递给控制器​​函数):

var index = $stateParams.index;
var anotherKey = $stateParams.anotherKey;
console.log(anotherKey); //it works!

11

就我而言,我尝试了此处给出的所有选项,但是没有人能正常工作(角度1.3.13,离子1.0.0,UI角度路由器0.2.13)。解决方案是:

.state('tab.friends', {
      url: '/friends/:param1/:param2',
      views: {
        'tab-friends': {
          templateUrl: 'templates/tab-friends.html',
          controller: 'FriendsCtrl'
        }
      }
    })

并在state.go中:

$state.go('tab.friends', {param1 : val1, param2 : val2});

干杯


如果控制器使用相同的名称来尊重参数,那么这对我来说就很好了,例如$ stateParams.param1。
nuander

是的@nuander,我忘了提及如何访问该变量,谢谢!
Cris R

8

我花了很多时间与Ionic / Angular的$ state和$ stateParams战斗;

要使用$ state.go()和$ stateParams,您必须进行某些设置,并且其他参数不能出现。

在我的app.config()中,我包含了$ stateProvider并在其中定义了几种状态:

$stateProvider
    .state('home', {
        templateUrl: 'home',
        controller:  'homeController'
    })
    .state('view', {
        templateUrl: 'overview',
        params:      ['index', 'anotherKey'],
        controller:  'overviewController'
    })

params键就显得尤为重要。同样,请注意,这里不url存在任何键...利用stateParams和URL不能混合使用。它们彼此互斥。

在$ state.go()调用中,将其定义如下:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })

indexanotherKey,如果他们在$ stateController第一家上市$ stateParams变量将只填充params定义键。

在控制器内,包括$ stateParams,如图所示:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams.index;
    var anotherKey = $stateParams.anotherKey;
});

传递的变量应该可用!


该值可以是JSON对象吗?就像$ state.go('view',{'editObj':{val1:2,val2:3,val4:'Hello'}})一样。因为这对我不起作用。
PavanSandeep,2015年

6

尝试一下reload: true

无法找出最长的时间-事实证明我在自欺欺人。如果确定一切编写正确,并且将使用相同的状态,请尝试reload: true

.state('status.item', {
    url: '/:id',
    views: {...}
}

$state.go('status.item', { id: $scope.id }, { reload: true });

希望这可以节省您的时间!


5

我也遇到过类似的问题。经过大量的谷歌搜索和试用和测试,我最终找到了一个可行的解决方案。这是适合您的我的解决方案。

我有两个控制器-searchBoxControllerstateResultController,以及一个名为searchQuery的参数,该参数将从具有搜索框的视图传递到显示从远程服务器获取的结果的视图。这是您的操作方式:

以下是您可以使用调用下一个视图的控制器 $state.go()

.controller('searchBoxController', function ($scope, $state) {
        $scope.doSearch = function(){
            var searchInputRaw = $scope.searchQueryInput;
            $state.go('app.searchResults', { searchQuery: searchInput });
        }
    })

下面是$state.go()执行get 时将被调用的状态:

.state('app.searchResults', 
            {
                url: '/searchResults',
                views:
                {
                    'menuContent': { templateUrl: 'templates/searchResult.html', controller: 'stateResultController' }
                },
                params: 
                {
                    'searchQuery': ''
                }
            })

最后,与app.searchResults状态关联的控制器:

.controller('stateResultController', function ($scope, $state, $stateParams, $http) {
        $scope.searchQueryInput = $stateParams.searchQuery;
    });

1
这对我有用,正是我需要的,因为我不想在URL中传递参数,但需要在状态声明中使用url属性。
Ernani

3

在我的父母/子女状态下。在子状态下声明的所有参数必须由父状态知道

        .state('full', {
            url: '/full',
            templateUrl: 'js/content/templates/FullReadView.html',
            params: { opmlFeed:null, source:null },
            controller: 'FullReadCtrl'
        })
        .state('full.readFeed', {
            url: '/readFeed',
            views: {
                'full': {
                    templateUrl: 'js/content/templates/ReadFeedView.html',
                    params: { opmlFeed:null, source:null },
                    controller: 'ReadFeedCtrl'
                }
            }
        })

2

我们进入具有两个参数的状态的解决方案正在更改:

.state('somestate', {
  url: '/somestate',
  views: {...}
}

.state('somestate', {
  url: '/somestate?id=:&sub=:',
  views: {...}
}

1

您在router.js中定义以下内容

$stateProvider.state('users', {
    url: '/users',
    controller: 'UsersCtrl',
    params: {
        obj: null
    }
})

您的控制器需要添加$ stateParams。

function UserCtrl($stateParams) {
    console.log($stateParams);
}

您可以通过参数发送对象,如下所示。

$state.go('users', {obj:yourObj});

1

我试图从第1页导航到第2页,并且还必须传递一些数据。

在我的router.js中,我添加了params 名称age

.state('page2', {
          url: '/vehicle/:source',
          params: {name: null, age: null},
.................

Page1中,单击下一步按钮:

$state.go("page2", {name: 'Ron', age: '20'});

Page2中,我可以访问这些参数:

$stateParams.name
$stateParams.age

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.