11

Ich versuche, die zurückgegebenen Daten aus einem eckigen $ Ressource mit Daten aus einem benutzerdefinierten Service zu dekorieren. Mein Code ist:

angular.module('yoApp') 
    .service('ServerStatus', ['$resource', 'ServerConfig', function($resource, ServerConfig) { 
    var mixinConfig = function(data, ServerConfig) { 
     for (var i = 0; i < data.servers.length; i++) { 
     var cfg = ServerConfig.get({server: data.servers[i].name}); 
     if (cfg) { 
      data.servers[i].cfg = cfg; 
     } 
     } 
     return data; 
    }; 

    return $resource('/service/server/:server', {server: '@server'}, { 
     query: { 
     method: 'GET', 
     isArray: true, 
     transformResponse: function(data, header) { 
      return mixinConfig(angular.fromJson(data), ServerConfig); 
     } 
     }, 
     get: { 
     method: 'GET', 
     isArray: false, 
     transformResponse: function(data, header) { 
      var cfg = ServerConfig.get({server: 'localhost'}); 
      return mixinConfig(angular.fromJson(data), ServerConfig); 
     } 
     } 
    }); 
}]); 

Es scheint, dass ich etwas falsch in Bezug auf Dependency Injection tue. Die von ServerConfig.get() zurückgegebenen Daten werden als nicht aufgelöst markiert. Ich habe diese Arbeit in einem Controller, wo ich die Transformation zu tun mit

ServerStatus.get(function(data) {$scope.mixinConfig(data);}); 

Aber ich würde eher die Dekoration in dem Dienst tun. Wie kann ich das schaffen?

+0

Wird die Funktion 'transformResponse' aufgerufen? Welche Version von Angular verwenden Sie? Hier finden Sie ein minimalistisches Beispiel zur Implementierung der Antwortdekoration: http://jsfiddle.net/YxTNL/1/ –

+0

@ LukasBünger Danke für Ihre Antwort. Ich habe eine Lösung gefunden und sie auf http://jsfiddle.net/maddin/7zgz6/ veröffentlicht. Was ich erreichen wollte, ist in transformResponse nicht möglich. Ich denke, ich schreibe eine richtige Antwort ... – Maddin

Antwort

8

Es ist nicht möglich, die TransformResponse zu verwenden, um die Daten mit Daten aus einem asynchronen Service zu dekorieren. Ich habe die Lösung auf http://jsfiddle.net/maddin/7zgz6/ veröffentlicht. Hier

ist der Pseudo-Code Erläuterung der Lösung:

angular.module('myApp').service('MyService', function($q, $resource) { 
    var getResult = function() { 
    var fullResult = $q.defer(); 
    $resource('url').get().$promise.then(function(data) { 
     var partialPromises = []; 
     for (var i = 0; i < data.elements.length; i++) { 
     var ires = $q.defer(); 
     partialPromisses.push(ires); 
     $resource('url2').get().$promise.then(function(data2) { 
      //do whatever you want with data 
      ires.resolve(data2); 
     }); 
     $q.all(partialPromisses).then(function() { 
      fullResult.resolve(data); 
     }); 
     return fullResult.promise; // or just fullResult 
     } 
    }); 
    }; 
    return { 
    getResult: getResult 
    }; 
}); 
7

Nun, es ist tatsächlich möglich, die Daten für eine Ressource asynchron, aber nicht mit der transformResponse Methode zu dekorieren. Ein interceptor sollte verwendet werden.

Hier ist ein schnelles Beispiel.

angular.module('app').factory('myResource', function ($resource, $http) { 
    return $resource('api/myresource', {}, { 
    get: { 
     method: 'GET', 
     interceptor: { 
     response: function (response) { 
      var originalData = response.data; 
      return $http({ 
       method: 'GET', 
       url: 'api/otherresource' 
      }) 
      .then(function (response) { 
       //modify the data of myResource with the data from the second request 
       originalData.otherResource = response.data; 
       return originalData; 
      }); 
     } 
     } 
    }); 

können Sie verwenden einen Dienst/Ressource statt $http.

Update:
Aufgrund der Art und Weise Winkel des $ resource Interceptor den oben stehenden Code nur dann umgesetzt wird, um die Daten durch die $ Versprechen und in einer Art und Weise bricht einige der $ resource Konzepte, dies insbesondere zurückgegeben dekorieren.

var myObject = myResource.get(myId); 

Nur diese Arbeit.

var myObject; 
myResource.get(myId).$promise.then(function (res) { 
    myObject = res; 
}); 
+1

"bricht einige der $ Ressourcen-Konzepte" zu schlecht! $ Ressource Art von saugt. Danke für die hilfreichen Informationen! –