2013-05-14 9 views
6

Chciałbym móc skonfigurować zasoby przy użyciu $ resource za pomocą CORS, aby zażądać moich danych. Mam CORS pracującego z $ http, ale te same techniki nie mają zastosowania do $ resource i miałem nadzieję, że ktoś przyszedł mi na ratunek i pokazał mi, jak z $ resource.

Zmodyfikowałem last step of the Angular tutorial, aby używać CORS hakując usługę phonecatServices w pliku services.js.

Znalazłem this example, który używa $ http.defaults.useXDomain = true; usuń $ http.defaults.headers.common ['X-Requested-With']; linię, aby uzyskać kątowy wniosek o dane za pomocą CORS, ale jeśli spróbuję $ resource.defaults.useXDomain = true; Pojawia się błąd: "Nie można ustawić właściwości" useXDomain "z undefined".

Zakładam, że zasób $ $ nie ma tej właściwości, więc moje pytanie brzmi: jak skonfigurować $ zasób, aby żądań zasobów domeny krzyżowej za pomocą CORS.

Oto mój kod:

angular.module('phonecatServices', ['ngResource']). 
    factory('Phone', function($resource){ 
    return $resource('http\\://localhost\\:8080/:phoneId.json', {}, { 
    query: {params:{phoneId:'phones'}, isArray:true} 
    }); 
}); 

otrzymuję następujący błąd, gdy próbuję zrobić wniosek: Przedmiot # < zasobów > ma metoda 'push'

EDIT

Próbowałem skonfigurować $ http i działa przez większość czasu, ale gdy wywołanie jest wykonane do kwerendy zasobów, w tym przypadku Phone.get (phoneId); wydaje się, że powyższy błąd został zgłoszony.

Telefoniczny kod

Podejrzewam, że jest przyczyną błędu (od controllers.js step 11 angular tutorial):

function PhoneDetailCtrl($scope, $routeParams, Phone) { 
    $scope.phone = Phone.get({phoneId: $routeParams.phoneId}, function(phone) { 
    $scope.mainImageUrl = phone.images[0]; 
    }); 

    $scope.setImage = function(imageUrl) { 
    $scope.mainImageUrl = imageUrl; 
    } 
} 

Jeśli usunąć wnętrzności powyższej metodzie kod działa poprawnie (bez uzyskania obrazu na stronie internetowej) , ale nie rozumiem, dlaczego to nie zadziałałoby? Skonfigurowałem usługę $ http, aby używać CORS, tak aby najwyraźniej przekazać ją do $ resource.

Czy ktoś może rzucić na nią jakiekolwiek światło? (każdy przykładowy kod byłby bardzo doceniany).

EDIT: 13/08/13

Tak więc każdy odwiedzając to pytanie jest świadomy, żadna z odpowiedzi poniżej naprawdę odpowiedział na pytanie, badam odpowiedź siebie, ale jeśli ktoś zauważy to i ma odpowiedź Bardzo to doceniam.

EDIT: 06/09/13

Obecnie patrząc na ten projekt, wydaje się, aby umożliwić wszystkim szukam: https://github.com/jpillora/xdomain

+0

Czy próbowałeś już korzystać z usługi? –

+1

czy mógłbyś dać mi przykład, Edgar? –

Odpowiedz

3

OK, rozwiązanie znalazłem na moim projekcie jest xdomain: https://github.com/jpillora/xdomain

Zgadzam się, że może to nie być odpowiednie dla wszystkich, ale to przyzwoity rozwiązanie krzyż przeglądarki i podczas gdy utknęliśmy z IE < 10 to wydaje się być najlepszym rozwiązaniem. (Jestem świadomy, że IE8 i IE9 zapewniają częściowe wsparcie, ale jak zawsze z IE nie jest pełne wsparcie i nie chcę tracić czasu na robienie kolejnej pracy dla IE).

Dziękuję wszystkim, którzy udzielili odpowiedzi na to pytanie.

0

Myślę, że ta próba może pracować dla Ciebie

angular.module('myBeerApp.services', ['ngResource']). 
    value('version', '0.1'). 
    factory('beerDB', function($resource) { 
    return $resource('URL',{ 
     alt:'json', 
     appToken:'TOKEN', 
     q:'rock', 
     callback: 'JSON_CALLBACK' 
    }, 
     { 
     get: { 
      method:'JSONP', 
      headers: { 
      'Content-Type': 'application/json', 
      'Accept': 'application/json' 
      } 
      } 
     }); 
    }); 
+0

dzięki mate, nie chcę używać JSONP chociaż, co jeśli chcę wysłać DELETE lub PUT zamiast tylko GET? Zrobiłem trochę badań od tego czasu i myślę, że może to być błąd w moim kodzie, niedługo wrócę do niego i spróbuję go naprawić i zaktualizować tutaj. –

-1

Czy nazywasz useXDomain = true w swojej aplikacji.config();

+0

Tak, mam CORS działającego z $ http, więc konfiguracja została poprawnie skonfigurowana, użyłem też jakiegoś zasobu elses na serwerze z przykładu online (został on teraz usunięty) i to działało dla $ http ale nie $ zasobu. Tbh, myślę, że zasób XDomain, który dodałem w powyższej edycji, będzie rozwiązaniem, z którym będę współpracować. Wygląda na to, że działa z większą liczbą przeglądarek i obecnie testuję go w moim projekcie; Odpowiem, gdy dowiem się więcej. Dziękuję za odpowiedź, cieszę się, że pytanie nie umarło! –

Powiązane problemy