Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用UI路由器将对象传递到状态?_Javascript_Angularjs_Angular Ui Router - Fatal编程技术网

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

Javascript 如何使用UI路由器将对象传递到状态?,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我希望能够使用ui路由器转换到状态并传递任意对象 我知道通常会使用$stateParams,但我相信这个值会插入到URL中,我不希望用户能够将这些数据添加到书签中 我想做这样的事 $state.transitionTo('newState', {myObj: {foo: 'bar'}}); function myCtrl($stateParams) { console.log($stateParams.myObj); // -> {foo: 'bar'} }; 是否有一种方法可以

我希望能够使用ui路由器转换到状态并传递任意对象

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

我想做这样的事

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

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

是否有一种方法可以在不将值编码到URL中的情况下执行此操作?

否,当参数传递到
传递到
时,URL将始终更新


这在中发生。

实际上,您可以这样做

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


这里描述了所有内容,正如您所见,这是解决问题的方法。

这个问题有两个部分

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

2) 将对象作为参数传递: 因为每个参数都转换为字符串(EDIT:自0.2.13以来,这不再是真的-您可以直接使用对象),所以没有必要这样做,但您可以通过自己创建字符串来解决这个问题

toParamsJson = JSON.stringify(toStateParams);
并在目标控制器中再次反序列化该对象

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

在版本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的评论,为方便起见复制于此:

克里斯托弗:是的,这应该在0.2.13中起作用

.state('foo',{url:'/foo/:param1?param2',params:{param3: null}//null是默认值})

$state.go('foo',{param1:'bar',param2:'baz',param3:{id:35, 名称:'what'}})

'foo'中的$stateParams现在是{param1:'bar',param2:'baz',param3:{ id:35,名字:'什么'}

url是/foo/bar?param2=baz


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

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

(二)



ui路由器机制在导航中保留URL状态。因此,如果用户刷新页面,他将返回到他所在的页面。如果您不想使用这种行为,请考虑使用其他MeChanistic(控制器/指令中的原始函数),并使用Cookies /存储来存储临时数据存储区,其中URL作为数据的关键,也许值是从哪里来的?router的概念是“解析”,在转换到请求的状态之前将数据加载到作用域中。类似地,还有oneter和onExit方法。此外,您还可以使用本地存储。如上所述,听起来您可能希望在移动到某个状态之前查看数据解析。请参阅stackOverlord的答案,了解如何正式执行。我尝试了这段精确的代码,但对象未被保留。您无法传递对象,只能传递单个参数值。。。。若要将其作为对象,则必须将所有属性作为不同的url参数。Angular ui路由器开发者仍在努力传递整个对象。事实上,斯瓦托普卢克·莱德尔给出了一个很好的解决方案。只需将对象作为一个完整的json字符串,然后解析它。:)实际上,对于传递对象,这是一个很好的技巧:)我们可以直接传递对象。检查已接受的回答是否与
Transition to
一起工作。我一定是做错了什么:-/我在0.2.13上,但如果我试图通过并反对它,它将以字符串
[object object]
@ErichBSchulz的形式出现,尽管它没有包含在这个回答中,实现这一点的诀窍是在状态的URL字符串中包含参数名,并将类型指定为JSON。例如,
$stateProvider.state('myState',{url:'/myState/{myParam:json}',params:{myParam:null},…
请参阅此功能的和代码注释。我的url中有一个id参数,并且必须将其添加到params对象中。
{url:'/myState/{id:[0-9]+},params:{id:null,myParam:null},…
一定有一些黑魔法在起作用-我的整个json都显示了url:(((我们如何在中接收此对象。state@Shubham您可以为接收对象的状态配置“参数”,然后使用$stateParams检索该对象。有关详细信息,请参阅文档。这可以工作,但无法在页面刷新后保留数据。
ui-sref="myState({ myParam: myObject })"
$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'
                    }
                }
            })
.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));


    })