在解决Angular航线中的承诺时,$ state不会填充

时间:2017-03-28 19:12:18

标签: angularjs angular-ui-router

我遇到过这种情况,我可以看到$ 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>

2 个答案:

答案 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传递给服务。