我遇到过这种情况,我可以看到$ stateParams在一个地方填充但不在另一个地方填充。我是angular-ui-router的新手,所以任何帮助都会受到赞赏。谢谢!
在以下状态的解析块中,我将$ stateParams作为依赖项注入数据' campaign'并填充$ stateParams。
.service('CampaignService', function($injector, $q) {
this.get = function() {
var $stateParams = $injector.get('$stateParams');
console.log('$stateParams is empty here!', $stateParams);
var deferred = $q.defer();
setTimeout(function() {
deferred.resolve({
name: 'campaignName'
});
}, 1000);
return deferred.promise;
}
})
然而,在CampaignService函数中,我需要$ stateParams,但它是 空。我很困惑,因为我在假设,因为我把它注入了 解决阻止,无论我在哪里,它都应该是相同的。
<a type="mention" href="/user/Jordan" title="Jordan">Jordan</a>
答案 0 :(得分:1)
您的服务可能不应该关心状态参数。您已经在状态定义中传递campaignId
值,因此为了在服务中使用它,您可以像这样修改它:
.service('CampaignService', function($injector, $q) {
this.get = function(campaignId) {
console.log('campaignId = ' + campaignId);
var deferred = $q.defer();
setTimeout(function() {
deferred.resolve({
name: 'campaignName'
});
}, 1000);
return deferred.promise;
}
})
答案 1 :(得分:1)
我假设因为当我在解决方案块中注入它时它已经填充,无论我在哪里再次获得它,它应该是相同的。
注入解析块的$stateParams
是建议的 future 状态。在那个时间点,应用程序仍在使用旧状态。如果任何决心承诺被拒绝,它将保持旧状态。
在幕后,$state
服务会创建一个本地版本的$stateParams
,它会在解析函数中注入:
var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params); var locals = { $stateParams: $stateParams }; // Resolve 'global' dependencies for the state, i.e. those not specific to a view. // We're also including $stateParams in this; that way the parameters are restricted // to the set that should be visible to the state, and are independent of when we update // the global $state and $stateParams values. dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state); var promises = [dst.resolve.then(function (globals) { dst.globals = globals; })];
- https://github.com/angular-ui/ui-router/blob/legacy/src/state.js#L1427-L1437
解决方案是将建议的未来$stateParams
传递给服务。