Работя върху уеб приложение, което се захранва от спокоен API, написан с рамката CherryPy на Python. Започнах да пиша потребителския интерфейс с комбинация от jQuery и шаблони от страна на сървъра, но в крайна сметка преминах към Backbone.js, защото jQuery излизаше извън контрол.
За съжаление, имам проблеми със синхронизирането на моите модели със сървъра. Ето бърз пример от моя код:
$(function() {
var User = Backbone.Model.extend({
defaults: {
id: null,
username: null,
token: null,
token_expires: null,
created: null
},
url: function() {
return '/api/users';
},
parse: function(response, options) {
console.log(response.id);
console.log(response.username);
console.log(response.token);
console.log(response.created);
return response;
}
});
var u = new User();
u.save({'username':'asdf', 'token':'asdf'}, {
wait: true,
success: function(model, response) {
console.log(model.get('id'));
console.log(model.get('username'));
console.log(model.get('token'));
console.log(model.get('created'));
}
});
});
Както вероятно можете да разберете, идеята тук е да регистрирате нов потребител в услугата. Когато извикам u.save();
, Backbone наистина изпраща POST заявка до сървъра. Ето съответните битове:
Искане:
Request URL: http://localhost:8080/api/users
Request Method: POST
Request Body: {"username":"asdf","token":"asdf","id":null,"token_expires":null,"created":null}
Отговор:
Status Code: HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 109
Response Body: {"username": "asdf", "created": "2013-02-07T13:11:09.811507", "token": null, "id": 14, "token_expires": null}
Както можете да видите, сървърът успешно обработва заявката и изпраща обратно id
и стойност за created
. Но по някаква причина, когато кодът ми извика console.log(u.id);
, получавам null
, а когато кодът ми извика console.log(u.created);
, получавам undefined
.
tl;dr: Защо Backbone.js не запазва промените в моите обекти след извикване на save()
?
Редактиране: Промених горния код, така че свойствата на модела да са достъпни чрез функцията get в success
обратно извикване. Това трябва да разреши всички проблеми с паралелността с оригиналния код.
Също така добавих някои конзолни регистрационни файлове във функцията parse
на модела. Колкото и да е странно, всяко от тях е undefined
... Означава ли това, че Backbone.js не успява да анализира отговора ми JSON?
Редактиране 2: Преди няколко дни разбрах, че проблемът всъщност е персонализирана заглавка, която добавях към всяка заявка, за да активирам основно HTTP удостоверяване. Вижте този отговор за подробности.
Model.urlRoot
вместоModel.url
, но това не е проблемът тук). По-ранните ревизии на вашия код са имали проблеми, но сте абсолютно сигурни, че точният код в текущата ви редакция все още е неуспешен? - person jevakallio   schedule 20.02.2013