我正在尝试从控制器中重构一些代码并进入路由的“解析”,并且无法从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
,它将返回函数而不是函数的返回值。
答案 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;
}
]);