如何通过AngularJS的$stateparams传递完整vms对象而非仅ID?
解决方法:通过UI-Router传递完整对象到下一状态
要传递完整的vms对象,你需要调整视图、状态配置和控制器跳转逻辑这几个部分,具体步骤如下:
1. 更新视图中的ui-sref
原来的ui-sref只传递了itemId,现在需要同时把整个vms对象传入obj参数:
<div class="td-table" ng-repeat="vms in load_all | filter: Search"> <div class="info-body" ui-sref="chart({itemId: vms.ID, obj: vms})"> <!-- 你的内容 --> </div> </div>
2. 优化状态配置(可选但推荐)
你的状态配置已经添加了obj参数,但为了避免对象被强制序列化到URL中(这会导致数据丢失或URL异常),可以明确设置obj参数不参与URL路由:
$stateProvider.state('chart', { url: '/chart/{itemId}', params: { obj: { squash: true, // 当参数为null/undefined时,不会在URL中显示 value: null // 默认值 } }, // 其他配置(templateUrl, controller等) });
注:如果不需要URL中保留
itemId,也可以把itemId移到params里,只保留url: '/chart',这样URL更简洁。
3. 修改状态1控制器的跳转逻辑
如果是通过$state.go手动跳转,需要同时传递itemId和完整的vms对象:
$scope.ListAnswer = function(vms) { $state.go('chart', { itemId: vms.ID, obj: vms }); };
这里建议直接传入
vms对象,而不是只传itemId再去查找,更高效。
4. 在状态2控制器中接收完整对象
现在你可以直接通过$stateParams.obj拿到完整的vms对象了:
$scope.informations = $stateParams.obj; console.log($scope.informations); // 这里会输出完整的vms对象
关键注意点
- 不要把复杂对象放在URL参数中:UI-Router会尝试把对象序列化为字符串,这可能导致数据丢失或URL异常,所以非URL参数(即
params中不在url里的参数)更适合传递对象。 - 如果你的
vms对象很大,也可以考虑用自定义服务(比如DataShareService)来存储和传递数据,这在复杂场景下更可靠。
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

