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上。