2012-03-06 13 views
8

Mam podstawowy model szkieletowy, jego atrybut urlRoot jest ustawiony, a odpowiedni obiekt docelowy po stronie serwera zwraca poprawne wyjście JSON (zarówno ciąg JSON, jak i nagłówek application/json).Backbone.js fetch nie ustawia atrybutów

nazywam sprowadzić tak:

var athlete = new Athlete({ id: 1 }); 
athlete.fetch(); 

w tym momencie, jeśli mogę dodać

console.log(athlete); 

widzę model i kontrolowanie go w Firebug mogę otworzyć atrybuty obiektów i zobacz wszystkie wartości zwrócone z serwera.

ale jeśli mam zrobić:

console.log(athlete.get('name')); 

uzyskać undefined (nazwa pojawia się pod atrybutów w inspekcji DOM wspomniałem powyżej)

również robi:

console.log(athlete.attributes); 

zwraca obiekt zawierający tylko {id: 1}, który jest argumentem, który przekazałem podczas tworzenia modelu.

Jeśli utworzyć model takiego:

var athlete = new Athlete(<JSON string copypasted from the server response>); 

następnie wszystko działa w porządku, .get() metoda powraca co pytam, i athlete.attributes pokazuje wszystkie wartości.

Co robię źle?

Odpowiedz

18

fetch jest asynchroniczny, co oznacza, że ​​dane nie będą dostępne po natychmiastowym wywołaniu console.log(athlete.get('name')) po pobraniu.

użyć zdarzenia być powiadomiony, gdy dane są dostępne, na przykład

var athlete = new Athlete({id: 1}); 
athlete.on("change", function (model) { 
    console.log(model.get('name')); 
}); 
athlete.fetch(); 

lub dodać zwrotnego do swoich sprowadzić

var athlete = new Athlete({ id: 1 }); 
athlete.fetch({ 
    success: function (model) { 
     console.log(model.get('name')); 
    } 
}); 

lub skorzystać z obietnicą zwróconej przez fetch:

athlete.fetch().then(function() { 
    console.log(athlete.get('name')); 
}); 
+0

Oczywiście teraz zdaję sobie sprawę, jak oczywiste było, dzięki za wskazanie :) –

1

Podobnie jak krótka uwaga przy korzystaniu z wydarzeń w tym przykładzie. W moim przypadku nie zadziałało to w przypadku change, ponieważ zdarzenia te są uruchamiane przy każdej zmianie. Tak więc sync robi sztuczkę.

var athlete = new Athlete({id: 1}); 
athlete.on("sync", function (model) { 
    console.log(model.get('name')); 
}); 
athlete.fetch();