我想在stateprovider中解决一个promise,因为我必须在另一个promise中使用promise的结果。
我不太确定该怎么做。我做了类似的事情
app
.config(['$stateProvider','GeolocationService',
function($stateProvider,geolocation){
$stateProvider.state('sendCoords',{
resolve: {
long: function (geolocation) {
geolocation().then(function (position) {
return position.coords.longitude;
}, function (reason) {
return false;
})
},
lat: function (geolocation) {
geolocation().then(function (position) {
return position.coords.longitude;
}, function (reason) {
return false;
})
}
},
controller: 'appCtrl'
})
}
]);
这是否正确?我想解决地理定位,然后使用' lat'而且' long'控制器中的变量。
app.controller('appCtrl',['$scope','serviceTest',function($scope,serviceTest,lat,long){
$scope.optionsToChoose = [];
serviceTest.options(long,lat).then(
function (option) {
$scope.optionsToChoose = option;
},
function(error){
}
);
}]
但是,像这样注入lat和long,它们没有被定义。我相信我在这里犯了一些错误,但我并没有真正理解。希望你能帮帮我。
编辑:这是地理位置服务代码
app.factory("GeolocationService", ['$q', '$window', '$rootScope',
function ($q, $window, $rootScope) {
return function () {
var deferred = $q.defer();
if (!$window.navigator) {
$rootScope.$apply(function() {
deferred.reject(new Error("Geolocation is not supported"));
});
} else {
$window.navigator.geolocation.getCurrentPosition(function (position) {
$rootScope.$apply(function() {
deferred.resolve(position);
});
}, function (error) {
$rootScope.$apply(function() {
deferred.reject(error);
});
});
}
return deferred.promise;
}
}]);
答案 0 :(得分:1)
ui.router
支持注入"已解决"将值转换为其他待解析函数。我会使用@charlietfl将long
和lat
解析为单个对象的好建议:
resolve: {
position: function(GeolocationService){
return GeolocationService().then(function(position){
return { long: position.coords.longitude,
lat: position.coords.latitude };
});
},
options: function(serviceTest, position){
return serviceTest.options(position.long, position.lat)
.then(function(option){ return option; });
}
}