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

我使用ui-router v0.2.0使用AngularJS v1.2.0-rc.2。 我想将引用状态传递给另一个状态,所以我使用$state.go像这样:

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

根据文档 ,这应该填充toState控制器上的$stateParams ,但它是undefined 。 我错过了什么?

我创造了一个庞然大物来演示:

http://plnkr.co/edit/ywEcG1

如果你想传递非URL的状态,那么你在设置你的state时候一定不要使用url 。 我在公关上find了答案 ,并做了一些揣测,以便更好地理解。

 $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的情况下转换状态的强大手段。

弥敦道马修斯的解决scheme并不适合我,但它是完全正确的,但有一点点的解决方法:

关键点是: 定义参数的types和$ state.go的toParamas应该是状态转换两边相同的数组或对象。

例如,当你在一个状态中定义一个参数时,你的意思是params是数组,因为使用了“[]”:

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

所以你也应该像这样传给数组:

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

更好的解决scheme是在对象中使用对象而不是数组

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

我用参数定义中的{}replace了{}。 为了传递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; }); 

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

 url: '/toState?referer' 

卫生署!

不确定它是否能够与ui-router v0.2.0一起使用AngularJS v1.2.0-rc.2。 我用ui-router v0.2.13在AngularJS v1.3.14上testing了这个解决scheme。

我只是意识到,没有必要像gwhn所build议的那样在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!"}); 

这个页面上的这些例子都没有为我工作。 这是我使用的,它运作良好。 有些解决scheme说,你不能把url和$ state.go()结合起来,但是这不是真的。 尴尬的事情是你必须定义的参数的url,并列出参数。 两者都必须在场。 testing在angular1.4.8和UI路由器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! 

我花了很多时间与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 $ stateParamsvariables只会在$ stateController params定义键中首先被列出。

在控制器中,包含$ stateParams,如图所示:

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

传递的variables应该可用!

在我的情况下,我尝试使用这里给出的所有选项,但没有人正常工作(angular1.3.13,离子1.0.0,angular – 路由器0.2.13)。 解决scheme是:

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

干杯

尝试用reload: true

无法弄清楚最长时间发生了什么 – 事实certificate我是在愚弄自己。 如果您确定所写内容正确,并且您将使用相同的状态,请尝试reload: true

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

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

我遇到了类似的问题。 经过大量的谷歌search和试用testing,我终于find了一个可行的解决scheme。 这是我的解决scheme,将为您工作。

我有两个控制器 – searchBoxControllerstateResultController和名为searchQuery的参数从具有search框的视图传递到显示从远程服务器获取的结果的视图。 这是你如何做到的:

下面是使用$state.go()调用下一个视图的控制器。

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

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

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

而在我父母/小孩的情况下。 所有在子状态中声明的参数都必须由父状态知道

  .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' } } }) 

我们得到的解决scheme有两个参数的状态正在改变:

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

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

如果这是一个查询参数,您希望像这样传递: /toState?referer=current_user

那么你需要像这样描述你的状态:

 $stateProvider.state('toState', { url:'toState?referer', views:{'...'} }); 

来源: https : //github.com/angular-ui/ui-router/wiki/URL-Routing#query-parameters