Javascript 如何使用UI路由器将对象传递到状态?
我希望能够使用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'} }; 是否有一种方法可以
$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));
})