angular resolve返回函数而不是value

时间:2014-06-26 05:31:27

标签: javascript angularjs

我正在尝试从控制器中重构一些代码并进入路由的“解析”,并且无法从resolve获取正确的返回值。我认为问题是由于我对js闭包的误解或者角度为$ q的库。

在路由中:

.when('/countries/:id', {
      templateUrl: 'country/country.html',
      controller: 'countryCtrl',
      resolve: {
        ActiveCountry: ['CountryData', '$q', '$route', function(CountryData, $q, $route) {
          var defer = $q.defer();
          CountryData($route.current.params.id).then(function(data){
            console.log(data);
            defer.resolve(data);
          });
          return defer.promise;
        }]
      }
    })

此块中的console.log从api调用返回正确的JSON对象。但是,当它传递到控制器时,控制器从CountryData服务返回功能:

.controller('countryCtrl', [
  'CountryData',
  '$routeParams',
  '$scope',
  function (ActiveCountry, $routeParams, $scope) {
    var countryId = $routeParams.id;
    console.log(ActiveCountry);
    $scope.mapId = $routeParams.id.toLowerCase();
    $scope.country = ActiveCountry;
  }
]);

路由console.log的值是: Object {countryName: "Spain", currencyCode: "EUR", fipsCode: "SP", countryCode: "ES", isoNumeric: "724"…}

但控制台控制台日志是我CountryData服务的功能:

function (countryId) {
      var defer = $q.defer();
      $http.get(COUNTRIES_PATH + '&country=' + countryId + API_AUTH, { cache: true }).success(function (data) {
        defer.resolve(data.geonames[0]);
      });
      return defer.promise;
    } 

为什么路由中的对象没有正确传递给控制器​​?

此外,为什么在$q服务已内置路由器时,我需要在路由器中使用CountryData?如果不在路由中使用$q,它将返回函数而不是函数的返回值。

2 个答案:

答案 0 :(得分:1)

Angular将自动解析从resolve属性上的函数返回的任何promise。因此,您的resolve属性应如下所示:

resolve: {
  ActiveCountry: ['CountryData', '$q', '$route', function(CountryData, $q, $route) {
    return CountryData($route.current.params.id);
  }
}

在调用控制器方法$routeProvider之前,将解析所有作为参数传递给控制器​​的promise。有关详细信息,请参阅$routeProvider.when()

答案 1 :(得分:1)

你把'CountryData'然后使用ActiveCountry作为控制器参数。所以他们不匹配。

应该是国家数据'和CountryData

controller('countryCtrl', [
  'CountryData',
  '$routeParams',
  '$scope',
  function (CountryData, $routeParams, $scope) {
    var countryId = $routeParams.id;
    console.log(ActiveCountry);
    $scope.mapId = $routeParams.id.toLowerCase();
    $scope.country = ActiveCountry;
  }
]);