2013-03-16 13 views
5

Got uproszczoną $resource przykład tutaj (dostosowany od Kątowymi miejscu):

angular.module('project', ['mongolab']); 

function ListCtrl($scope, Project) { 
    $scope.projects = Project.test(); 
} 

angular.module('mongolab', ['ngResource']). 
factory('Project', function ($resource) { 
    var url, dfParams, actions; 

    url = 'https://api.mongolab.com/api/1/databases' + '/angularjs/collections/projects/:id'; 
    dfParams = { 
    apiKey: '4f847ad3e4b08a2eed5f3b54' 
    }; 

    actions = { 
    test: { 
     method: 'GET', 
     isArray: true, 
     transformResponse: function (response) { 
     // line is never getting called 
     console.log('transforming'); 
     return response; 
     } 
    }; 

    var Project = $resource(url, dfParams, actions); 
    return Project; 
}); 

Pytanie jest to, że linia console.log('transforming') nigdy nazywa uzyskiwanie. Dlaczego? Wszystko inne działa dobrze.

Live fiddle here.

Odpowiedz

10

Ta funkcja jest dostępna tylko w wersji 1.1.2 lub nowszej AngularJs. Nie jest dostępny w wersji 1.1.1 lub wcześniejszych AngularJs.

2

Wywołanie transformacji odpowiedzi nie jest ujawnione w usłudze $ resource. To żyje wewnątrz podstawowej usługi $ http.

więc masz dwie możliwości:

  • użyć „niskiego poziomu” $ http zamiast $ pozyskiwania zasobów,
  • Tworzenie jakiegoś owinięcia wokół zasobów, które mogłyby przekształcić odpowiedź sposób chcieć.
+0

Też tak pomyślałem (nie wyeksponowany w '$ resource'). Ale potem spojrzałem na kod '$ resource' i został on udokumentowany w [kodzie źródłowym] (https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L69- L74). Ponadto, czytając kod, widzisz, że rozszerza on 'httpConfig' i [przechodzi do ukrytego' $ http'] (https://github.com/angular/angular.js/blob/master/src/ngResource/resource. js # L437-L447). I wydaje się być celowe, ponieważ [napisał przypadek testowy] (https://github.com/angular/angular.js/blob/master/test/ngResource/resourceSpec.js#L686-L705) dla niego. –

+1

Patrzyłeś na niestabilną gałąź master, która jeszcze nie została zwolniona. – Stewie

+0

Tak, dostałem to przez @rgaskill odpowiedzi. Dzięki. –

1

Mam ten sam problem i używam AngularJS 1.2.26.
I zdefiniowano przechwytywania zawierający transformResponse z $ http poziom jak:

return { 
    'request': function (config) { 
     config.defaults.transformResponse = function(data){ 
      //some has been done 
     }; 
     return config; 
}, 

gdy usunę powyższy kod, mój transformResponse w $ zasobu działa!
Aby rozwiązać ten problem, zdefiniowane mój transformResponse w $ zasobu jak:

return $resource(pathConfig.serverURL + ':demoId', 
    { 
     demoId: "@id" 
    }, 
    { 
     hello: { 
      method: "GET", 
      url: serverDomain + ":demoId", 
      transformResponse: addTransformResponses(
       [ 
        function (data, getHeaders) { 
         //doing hello's OWN interceptors 
        } 
       ]) 
     } 
    }); 

i addTransformResponses zawiera wspólnego przechwytywania odczuwalna:

addTransformResponses: function (addTrans) { 
    return [this.parseResponseJson, this.parseResponseArray] 
     .concat(addTrans); 
}, 

//parse JSON 
parseResponseJson: function (data, getHeaders) { 
    try { 
     return angular.fromJson(data); 
    } catch (e) { 
     console && console.error("return data is not a JSON!"); 
     return data; 
    } 
}, 
parseResponseArray: function (data, getHeaders) { 
    if (angular.isArray(data)) { 
     return {"array": data}; 
    } 
    return data; 
} 

w ten sposób można skonfigurować wspólny myśliwce przechwytujące i własne urządzenia przechwytujące niektóre żądania! :)
Jeśli jakaś praktyka lepiej, proszę powiedz mi! dzięki!

+0

Gdzie dokładnie dodajesz funkcje 'addTransformResponses',' parseResponseJson' i 'parseResponseArray'? – Mauro

+0

@Mauro Jest to możliwe do zarządzania przy użyciu ** RequireJS **. – soytian

Powiązane problemy