Comment faire attendre le contrôleur pour la promesse de résoudre du service angulaire
J'ai un service qui est de faire une requête AJAX vers le serveur cible
Service:
function GetCompaniesService(options)
{
this.url = '/company';
this.Companies = undefined;
this.CompaniesPromise = $http.get(this.url);
}
Contrôleur:
var CompaniesOb = new GetCompanies();
CompaniesOb.CompaniesPromise.then(function(data){
$scope.Companies = data;
});
Je veux que mon service pour gérer l' ".ensuite, la fonction" plutôt que d'avoir à gérer dans mon contrôleur, et je veux être en mesure d'avoir mon contrôleur de la loi sur les données à PARTIR du service, après la promesse de l'intérieur, le service a été résolu.
Fondamentalement, je veux être en mesure d'accéder aux données comme suit:
var CompaniesOb = new GetCompanies();
$scope.Companies = CompaniesOb.Companies;
Avec la résolution de la promesse d'être traitées à l'intérieur du service lui-même.
Est-ce possible? Ou est la seule façon que je peux accéder à cette promesse de la résolution est de l'extérieur du service?
source d'informationauteur Axschech
Vous devez vous connecter pour publier un commentaire.
Si tout ce que vous voulez est de gérer la réponse de
$http
dans le service lui-même, vous pouvez ajouter unthen
fonction au service où vous n'avez plus de traitement puisreturn
à partir de cethen
fonction, comme ceci:Mais vous aurez encore utiliser une promesse dans le contrôleur, mais ce que vous obtenez de retour ont déjà été traités dans le service.
Il n'y a pas de problème pour atteindre cet!
La principale chose que vous devez garder à l'esprit est que vous devez garder la même référence de l'objet (et en javascript, les tableaux sont des objets) dans votre service.
voici notre HTML simple:
Ici est à notre service de mise en œuvre:
Et enfin le contrôleur comme vous le souhaitiez:
Explications
Comme dit ci-dessus, l'astuce est de garder la référence entre le service et le contrôleur. Une fois que vous respecter cela, vous pouvez tout à fait de lier votre contrôleur portée sur une propriété publique de votre service.
Ici un violon c'est fini.
Dans les commentaires du code, vous pouvez essayer de dé-commenter la pièce qui ne fonctionne pas et vous verrez comment le contrôleur est perdre de la référence. En fait, le contrôleur va continuer de se faire une référence à l'ancien tableau, tandis que le service va changer la nouvelle.
Une dernière chose importante: il faut garder à l'esprit que le $timeout est le déclenchement d'une $apply() sur le rootSCope. C'est pourquoi notre contrôleur de champ est "rafraîchissant " seul". Sans cela, et si vous essayez de le remplacer avec un setTimeout (), vous verrez que le contrôleur n'est pas la mise à jour de la liste de compagnie.
Pour contourner cela, vous pouvez:
Espérons que cette aide!
Vous pouvez passer le $scope dans GetCompanies et définir $champ d'application.Les entreprises de données dans le service
Vous devez faire attention à l'ordre dans lequel vous utiliser les données. C'est la raison derrière une promesse pour commencer.