如何使用UI路由器将对象传递到状态?


119

我希望能够使用ui-router转换为状态并传递任意对象。

我知道通常$stateParams会使用它,但是我相信此值会插入URL中,并且我不希望用户能够为该数据添加书签。

我想做这样的事情。

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

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

有没有办法在不将值编码到URL的情况下执行此操作?


1
ui-router机制在整个导航中保留URL状态。因此,如果用户刷新页面,他将返回到他所在的页面。如果您不想使用此行为,请考虑使用其他机制(控制器/指令中的原始函数等),并使用cookie /用于存储临时数据的存储设备
Neozaru

可以将localStorage与url用作数据的键?
尼尔

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

作为@JoshC。提到,听起来好像您可能想要在进入状态之前先研究解析数据。github.com/angular-ui/ui-router/wiki#resolve
TrazeK 2014年

请参阅stackOverlord的答案以了解如何正式进行。
AlikElzin-kilaka

Answers:


163

在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'}}

网址是/ foo / bar?param2 = baz。


工程与transitionTo为好。
AlikElzin-kilaka

13
我必须做一些错误: - /我在0.2.13,但如果我试图传递和对象谈到了在该州为字符串[object Object]
ErichBSchulz

15
@ErichBSchulz虽然未包含在此答案中,但完成此工作的技巧是在州的URL字符串中包含参数名称并将类型指定为JSON。例如 $stateProvider.state('myState', { url: '/myState/{myParam:json}', params: {myParam: null},...请参阅0.2.13发行说明和此功能的代码注释。
Syon

1
我的URL中有一个id参数,还必须将其添加到params对象中。{ url: '/mystate/{id:[0-9]+}', params: { id: null, myParam: null }, ...
GraehamF '16

3
必须有一些黑魔法在起作用-我的整个json都显示了网址:(((
Kabachok

25

这个问题有两个部分

1)使用不会更改网址的参数(使用params属性):

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

2)将对象作为参数传递:嗯,现在没有直接的方法,因为每个参数都转换为字符串(EDIT:从0.2.13开始,这不再成立-您可以直接使用对象),但是您可以通过自己创建字符串来解决它

toParamsJson = JSON.stringify(toStateParams);

然后在目标控制器中再次反序列化对象

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

1
实际上,对于传递对象而言,这是一个不错的技巧:)
Tek

我们可以直接传递对象。检查接受的答案
Kishore Relangi 2015年

20

实际上,您可以这样做。

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

这是有关state.go中选项的官方文档

在那里描述了所有内容,您可以看到这是完成的方法。


我尝试了此确切的代码,但未保留该对象。
Virmundi 2014年

1
您不能传递对象,而只能传递单个参数值。...要将其作为对象,必须将所有属性都设置为不同的url参数。Angular-ui-router开发人员仍在研究传递整个对象。实际上,Svatopluk Ledl伙计们给出了一个很好的解决方案。只需将对象作为整个json字符串,然后解析它即可。:)
Tek

13

顺便说一句,您还可以在模板中使用ui-sref属性来传递对象

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

1
我们如何在.state中收到该对象
Shubham

@Shubham您将为接收对象的状态配置“参数”,然后使用$ stateParams检索该对象。有关详细信息,请参见docangular-ui.github.io/ui-router/site/#/api/…

此方法有效,但在页面刷新后无法保留数据。

9

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


    })

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.