2013-12-17 51 views
104

我希望能够使用UI路由器转换到状态并传递任意对象。AngularJS:使用UI路由器将对象传入状态

我知道,通常使用$ stateParams,但我相信这个值被插入到URL中,我不希望用户能够为这些数据添加书签。

我想要这样做。

$state.transitionTo('newState', {myObj: {foo: 'bar'}}); 

function myCtrl($stateParams) { 
    console.log($stateParams.myObj); // -> {foo: 'bar'} 
}; 

有没有办法做到这一点没有编码的值到URL?

+1

UI路由器机制保持导航中的URL状态。 因此,如果用户刷新页面,他会回到他所在的页面。 如果您不想使用此行为,请考虑使用其他机制(控制器/指令等中的原始函数),并使用用于存储临时数据的cookie /存储 – Neozaru

+0

将localStorage与url一起用作数据的关键字可能是什么? – Neil

+2

价值从何而来? Ui.router具有在转换到请求状态之前将数据加载到作用域的“解析”概念。同样有onEnter和onExit方法。另外,你可以使用本地存储。 –

回答

144

在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工作。 ('foo',{url:'/ foo /:param1?param2',params:{param3: null} // null是默认值});};}};}};

$ state。go('foo',{param1:'bar',param2:'baz',param3:{id:35, name:'what'}});

$ stateParams在 '富' 现在是{参数1: '棒',参数2: '巴兹',参数3:{ ID:35,店名: '什么'}}

网址是/ foo /酒吧?参数2 =巴兹。

+0

也适用于'transitionTo'。 –

+11

我必须做错事: - /我在0.2.13,但如果我试图传递和反对它出现在字符串状态'[object object]' – ErichBSchulz

+9

@ErichBSchulz虽然它不包括在这答案,使这项工作的诀窍是在状态的URL字符串中包含参数名称,并将类型指定为JSON。恩。 '$ stateProvider.state('myState',{url:'/ myState/{myParam:json}',params:{myParam:null},...'参见[0.2.13发布说明](https:// github.com/angular-ui/ui-router/releases/tag/0.2.13)和这个功能的代码注释 – Syon

19

其实你可以做到这一点。

$state.go("state-name", {param-name: param-value}, {location: false, inherit: false}); 

This is the official documentation about options in state.go

一切都在那里描述,正如你可以看到这是做的方式。

+1

Awsome谢谢! – PSL

+0

我试过这个确切的代码,并没有保存对象。 – Virmundi

+0

你不能传递对象,你只能传递单个参数值....你把它作为一个对象,你必须把所有的属性作为不同的url参数。 Angular-ui路由器开发人员仍在致力于传递整个对象。其实那些家伙Svatopluk Ledl提供了一个很好的解决方案。只需将该对象作为一个整体json字符串进行解析即可。 :) – Tek

24

有此问题

1)的使用不会改变一个URL的参数(使用params属性)两个部分:传递一个对象作为参数

$stateProvider 
    .state('login', { 
     params: [ 
      'toStateName', 
      'toParamsJson' 
     ], 
     templateUrl: 'partials/login/Login.html' 
    }) 

2): 嗯,没有direct way how to do it now,,因为每个参数都被转换为字符串(编辑:从0.2.13开始,这不再是真实的 - 您可以直接使用对象),但是您可以通过自行创建字符串来解决该问题

toParamsJson = JSON.stringify(toStateParams); 

和目标控制器反序列化对象再次

originalParams = JSON.parse($stateParams.toParamsJson); 
+1

实际上对于传递对象这是一个相当不错的破解:) – Tek

+0

好主意 - 我使用https://docs.angularjs.org/api/ng/function/angular.toJson – Rodney

+0

我们可以直接传递对象。检查接受的答案 –

13

顺便说一句,你还可以使用UI-SREF属性,在模板传递对象

ui-sref="myState({ myParam: myObject })" 
+1

我们如何接收这个对象在.state – Shubham

+0

@Shubham你将配置'参数'的状态,将接收该对象,然后使用$ stateParams检索该对象。有关详细信息,请参阅文档http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$stateProvider。 – tao

+0

这个工作,但不能保持页面刷新后的数据。 – tao

8

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


    })