2013-04-16 8 views
6

Grałem w grę Backbone w mojej konsoli Chrome i mam problem z wieloma domenami, którego nie mogę rozwiązać.Backbone.js nie tworzy żądań między hostami?

Gospodarz łączę się przypuszczalnie poprawnie implementuje CORS ponieważ surowy żądanie XHR zwraca oczekiwaną JSON:

var http = new XMLHttpRequest(); 
http.open('GET', 'http://example.com:3000/entities/item/15.json', true); 
http.onreadystatechange = function(evt) { console.log(evt); } 
http.send(); 

(kłody 3 zdarzeń postępu XHR na konsoli z poprawnymi danymi w odpowiedzi)

Ale kiedy należy wykonać następujące czynności z Backbone przeglądarka nie podoba:

var Item = Backbone.Model.extend({}); 
var ItemsCollection = Backbone.Collection.extend({ 
    model: Item, 
    url: 'http://example.com:3000/entities/item/' 
}); 
var items = new ItemsCollection(); 
items.fetch(); 

(zwraca XMLHttpRequest cannot load http://example.com:3000/entities/item/. Origin http://localhost:8000 is not allowed by Access-Control-Allow-Origin.)

Czy muszę coś powiedzieć Backbone, aby pracować z CORS? Wydaje się, że ten błąd wystąpił, zanim przeglądarka wysłała żądanie, więc nie sądzę, że jest to błąd konfiguracji serwera.

+0

Można wyłączyć te same zasady pochodzenia w Chrome [tutaj] (http: // stackoverflow. com/a/3177718/1344509) wyjaśnił, jak wyłączyć tę funkcję w Chrome. – Ikrom

+0

Dzięki za napiwek, ale nie chcę go wyłączyć (jest przeznaczony do uruchamiania w zwykłych przeglądarkach internetowych). – magneticMonster

+0

Wtedy może [this] (http://stackoverflow.com/a/6487765/1344509) pomaga. – Ikrom

Odpowiedz

8

Mam nadzieję, że jeden z nich pomaga (nie próbowałem jeszcze):
1. Overriding Backbone.js sync to allow Cross Origin

(function() { 
    var proxiedSync = Backbone.sync; 
    Backbone.sync = function(method, model, options) { 
    options || (options = {}); 
    if (!options.crossDomain) { 
     options.crossDomain = true; 
    } 
    if (!options.xhrFields) { 
     options.xhrFields = {withCredentials:true}; 
    } 
    return proxiedSync(method, model, options); 
    }; 
})(); 

2. Cross domain CORS support for backbone.js

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    options.crossDomain ={ 
     crossDomain: true 
    }; 
    options.xhrFields = { 
     withCredentials: true 
    }; 
}); 
+1

'xhrFields.withCredentials' ulegnie awarii w Firefoksie, jeśli wykonujesz synchroniczne wywołanie AJAX, na przykład ładowanie szablonu przed renderowaniem. Na szczęście moje szablony znajdują się w tej samej domenie, więc mogłem po prostu zawinąć powyższe w 'if (originalOptions.async! == false)' block – kasztelan

+0

Gdzie powinienem dodać aktualizację metody synchronizacji? W backbone.js LUB w moim skrypcie? – dang

+0

@dang W twoim kodzie javascript, nie Backbonejs – Ikrom

0

Okazuje się, że adresy URL z wnosił Szkielety były nieco inne niż te żądane za pośrednictwem XHR (brakowało queryarg). To spowodowało, że serwer 500, który nie ma nagłówków CORS. Chrome nie wyświetlał wcale żądania HTTP na karcie sieciowej panelu debugowania, więc byłam bardzo zdezorientowana.

Naprawienie 500 na serwerze spowodowało ponowne wykonanie tej czynności.

5

hej można użyć coś takiego:

var PostsCollection = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    //this.id = options.id; 
    }, 
    url: 'http://myapi/api/get_posts/?count=8', 
}); 

posts = new PostsCollection(); 
posts.fetch({ 
    dataType: 'jsonp', 
    success : function (data) { 
    console.log(data); 
    } 
}); 

kluczem jest musimy użyć 'jsonp'

+0

Pracował bezbłędnie! – pastullo

+0

Dzięki, sir! "jsonp" rozwiązał mój problem –

+0

Dzięki @heridev .. rozwiązał mój problem .. – Manivannan

Powiązane problemy