Я работаю над веб-приложением, основанным на спокойном API, написанном с помощью платформы Python CherryPy. Я начал писать пользовательский интерфейс с комбинации 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