AngularJS:使用ui-router将对象传递到一个状态
我希望能够转换到一个状态,并使用ui路由器传递一个任意的对象。
我知道,通常使用$ stateParams,但我相信这个值插入到URL中,我不希望用户能够collections这些数据。
我想要做这样的事情。
$state.transitionTo('newState', {myObj: {foo: 'bar'}}); function myCtrl($stateParams) { console.log($stateParams.myObj); // -> {foo: 'bar'} };
有没有办法做到这一点,而不编码到URL的值?
在版本0.2.13中,您应该能够将对象传递给$ state.go,
$state.go('myState', {myParam: {some: 'thing'}}) $stateProvider.state('myState', { url: '/myState/{myParam:json}', params: {myParam: null}, ...
然后访问您的控制器中的参数。
$stateParams.myParam //should be {some: 'thing'}
myParam不会显示在URL中。
资源:
看到由christopherthielen的评论https://github.com/angular-ui/ui-router/issues/983 ,在这里转载为方便起见:
christopherthielen:是的,这应该在0.2.13现在工作。
.state('foo',{url:'/ foo /:param1?param2',params:{param3:null} // null是默认值});
$ state.go('foo',{param1:'bar',param2:'baz',param3:{id:35,name:'what'}});
'foo'中的$ stateParams现在是{param1:'bar',param2:'baz',param3:{id:35,name:'what'}}
url是/ foo / bar?param2 = baz。
这个问题有两个部分
1)使用不会改变url的参数(使用params属性):
$stateProvider .state('login', { params: [ 'toStateName', 'toParamsJson' ], templateUrl: 'partials/login/Login.html' })
2)传递一个对象作为参数:好吧,现在没有直接的方法,因为每个参数都被转换为string( 编辑 :自0.2.13,这不再是真的 – 你可以直接使用对象),但你可以通过自己创buildstring来解决这个问题
toParamsJson = JSON.stringify(toStateParams);
并在目标控制器中再次反序列化对象
originalParams = JSON.parse($stateParams.toParamsJson);
其实你可以做到这一点。
$state.go("state-name", {param-name: param-value}, {location: false, inherit: false});
这是关于state.go中选项的官方文档
一切都在那里描述,你可以看到这是要完成的方式。
顺便说一句,你也可以在你的模板中使用ui-sref属性来传递对象
ui-sref="myState({ myParam: myObject })"
1)
$stateProvider .state('app.example1', { url: '/example', views: { 'menuContent': { templateUrl: 'templates/example.html', controller: 'ExampleCtrl' } } }) .state('app.example2', { url: '/example2/:object', views: { 'menuContent': { templateUrl: 'templates/example2.html', controller: 'Example2Ctrl' } } })
2)
.controller('ExampleCtrl', function ($state, $scope, UserService) { $scope.goExample2 = function (obj) { $state.go("app.example2", {object: JSON.stringify(obj)}); } }) .controller('Example2Ctrl', function ($state, $scope, $stateParams) { console.log(JSON.parse($state.params.object)); })
不,在将parameter passing给transitionTo
时,URL总是会被更新。
这发生在ui-router中的 state.js:698上。