11
votes

Angular.js Passez les données du service ASYNC à la portée

J'ai un service comme xxx

et je veux faire d'un contrôleur quelque chose comme xxx

La getcurrentPosition fonctionne bien et le La ville est également déterminée, mais je ne sais pas comment accéder à la ville dans le contrôleur.

Que se passe-t-il? Quand GetCurrentCity est appelé, il appelle GetCurrentPosition pour déterminer les coordonnées GPS. Ces coordonnées sont transmises comme des arguments à la méthode OnSuccess, non? Donc, c'est tout à fait pareil que je veux faire dans la méthode GetCurrentCity, mais je ne sais pas comment. Ceux que le géocodeur Async a récupéré la ville, je souhaite appliquer les nouvelles données à la méthode ONSUCCESS.

Des idées?


0 commentaires

4 Réponses :


4
votes

Appelez simplement votre méthode onsuccess dans le service au lieu de gérer le résultat là-bas.

function MainCtrl($scope, geolocation) {
   geolocation.getCurrentCity(function(results, status){
       // Parse results for the city - not sure what that object looks like
       $scope.city = results.city;
   });
};


0 commentaires

29
votes

Vous avez affaire à des rappels et de la demande asynchrone. Vous devriez donc utiliser $ q service. Il suffit de l'injecter dans votre service avec $ Rootscope et de la dépendance cordiale. Et ajoutez les promesses à votre fonction comme celle-ci xxx

et dans votre contrôleur, faites ce qui suit pour gérer la promesse. xxx


6 commentaires

Correction de mon problème, j'ai eu un filtre qui causait la boucle.


La première approche de la mise en œuvre du contrôleur susmentionnée de la mise en place d'une propriété de $ sur une promesse ne fonctionne plus dans l'angulaire 1,3. Les promesses ne sont plus débordées, vous devez donc utiliser la deuxième approche (définissant la propriété $ d'étendue dans le gestionnaire de temps)


@jbandi: Vous semblez suggérer que quelque chose a changé. Je n'ai pas reçu quel est le changement exact. Cela vous dérange-t-il de le clarifier pour moi? Je vais mettre à jour la réponse en conséquence.


Le code coincé ci-dessus contient la ligne $ étendue.city = géolocession.getcurrentCity (); . Cette ligne assigne une promesse directement à la portée et s'appuie sur l'angulaire à "Laprapp" de cette promesse, cela signifie que Wrihn la promesse est résolue, angulaire mettra à jour $ la portée.City à la valeur résultant de la promesse. Cette caractéristique des promesses "Début" sur la portée de $ sur la portée n'est plus présente en angular 1.3 et plus (voir docs.angularjs.org/guide/migration )


Vous pouvez en savoir plus sur les raisons de la suppression de la fonctionnalité "PROMESTUn Tapping" ici: Michalostruszka.pl/blog/2013/12/05/angular-promises-unwrappi ng et ici github.com/angular/angular.js/commit/...


@jbandi j'ai édité le code pour refléter la pratique angulaire actuelle. Est-ce exact?



5
votes

Essayez ce xxx

Parfois, l'observateur n'est pas toujours appelé lors de l'instance du contrôleur, en forçant un événement de Digest, si la portée n'est pas en phase, vous pouvez aller là où vous voulez. aller, je crois. Faites-moi savoir si je n'ai pas compris votre question.

Oh et je ne sais pas si je lisais le code de manière propice, mais il semble que vous n'appeliez pas le rappel ONSUCCESS dans votre fonction: Remplacez votre fonction GetCurrenticity par ceci: xxx


0 commentaires

3
votes

Corrigez-moi si je me trompe, mais la solution présentée ne fonctionnera plus complètement, car les versions angulaires plus récentes (> 1.2 !?) ne débranchent plus $ q promesses automatiquement. P>

geolocation.getCurrentCity().then(function(city) {
    $scope.city = city;
}


0 commentaires