Ho un servizio comeAngular.js passare i dati da un servizio asincrono a portata
app.factory('geolocation', function ($rootScope, cordovaReady) {
return {
getCurrentPosition: cordovaReady(function (onSuccess, onError, options) {
navigator.geolocation.getCurrentPosition(function() {
var that = this,
args = arguments;
if (onSuccess) {
$rootScope.$apply(function() {
onSuccess.apply(that, args);
});
}
}, function() {
var that = this,
args = arguments;
if (onError) {
$rootScope.$apply(function() {
onError.apply(that, args);
});
}
}, options);
}),
getCurrentCity: function (onSuccess, onError) {
this.getCurrentPosition(function (position) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode(options,function (results, status) {
var city = address_component.long_name;
});
});
}
}
});
E voglio fare da un controller di qualcosa come
function MainCtrl($scope, geolocation) {
geolocation.getCurrentCity(function(city){
$scope.city = city;
});
};
Il getCurrentPosition funziona benissimo e la città è determinato anche, ma non so come accedere alla città nel controller.
Cosa succede? Quando viene chiamato getCurrentCity, richiama getCurrentPosition per determinare i gps coords. Queste coordinate sono passate come argomenti al metodo onSuccess giusto? Quindi questo è esattamente lo stesso che voglio fare con il metodo getCurrentCity, ma non so come. Un geocoder asincrono ha recuperato la città, voglio applicare i nuovi dati al metodo onSuccess.
Qualche idea?
Risolto il problema, avevo un filtro che causava il loop. –
Il primo approccio nell'implementazione del controller precedente di impostare una proprietà $ scope su una promessa non funziona più in Angular 1.3.Le promesse non vengono più scartate, quindi è necessario utilizzare il secondo approccio (impostando la proprietà $ scope nel gestore allora) – jbandi
@jbandi: sembra suggerire che qualcosa è cambiato. Non ho ottenuto qual è il cambiamento esatto. Ti dispiace chiarirlo per me? Aggiornerò la risposta di conseguenza. –