如何使用$ 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' })
index
和anotherKey
$ 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,将为您工作。
我有两个控制器 – searchBoxController和stateResultController和名为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