0

j'avoir un tel code de travail:

service (usine?):

myApp.factory('MyService', ['$q','$resource', 'MyResource', 
    function ($q, $resource, MyResource) { 

     return { 
      getRoles: function() { 
       return MyResource.getRoles(); //MyResource makes API calls using $resource 
      } } }); 

Controller:

$scope.Roles = MyService.getRoles(); 
$scope.Roles.$promise.then(function() { $scope.RolesCount = $scope.Roles.length; }); 

Ce que je voudrais faire est de créer une telle fonction dans MyService qui renverra le nombre de rôles une fois getRoles est résolu afin que je puisse l'utiliser dans le contrôleur comme ceci:

$scope.RolesCount = MyService.getRolesCount(); 

puis en html

{{RolesCount}} 

Malheureusement, je ne sais pas comment faire cela depuis ma méthode getRolesCount() doit retourner quelque chose que je ne peux pas utiliser promise.then $() à l'intérieur MyService . Je vais essayer de mettre à jour le titre de ma question une fois que je trouverai quelque chose de plus précis.

+0

Vous devez redéfinir l'action getRoles avec l'option 'actions' et fournir transformResponse, quelque chose comme ceci. – estus

+0

Yeap mais cela ressemble à manipuler sur la couche Resource/Repository. Que dois-je faire si je veux traiter les données renvoyées sur la couche Service (n'est-ce pas le cas?) Et renvoyer ensuite le résultat au contrôleur (comme référence d'objet de la même manière que $ resource le fait)? – Kostrzak

+0

Oui, un service est l'endroit le plus approprié. Mais dans votre cas, aucune de ces approches ne fonctionne car «alors» ne transforme pas seulement la réponse, mais déballe sa valeur. De plus, vous n'avez pas vraiment besoin de faire cela avec des ressources. – estus

Répondre

0

Si la réponse du serveur doit être transformée dans un service, then doit y être déplacé. Cependant, ce n'est pas pratique ou possible si then est supposé déballer une promesse et affecter une valeur à la portée, comme dans le code ci-dessus.

$reaource renvoie un objet rempli sur une résolution de promesse. La façon dont une ressource est censée être utilisée en vue est le suivant:

{{Roles.length}} 

Lorsqu'un objet est mis à jour, il sera mis à jour en vue, aussi. L'attribution de la valeur à une autre variable est inefficace.

Il est impossible de faire quelque chose comme

$scope.RolesCount = MyService.getRolesCount(); 

parce getRolesCount est asynchrone, et la valeur qu'elle résout avec est scalaire. Il est possible de l'aplatir avec `async..await, (TypeScript ou ES2017), mais nécessitera des mesures supplémentaires pour synchroniser le flux de contrôle avec les condensés AngularJS, comme expliqué dans this answer.