Как получить хороший ответ от сохранения модели
С backbone.js Я сохраняю модель. PUT отправляется на сервер, и ответ возвращается. В первый раз, когда я это делаю, он возвращает успех, следующие ошибки возвращаются, потому что после первого ответа ответ добавляется в модель.
Сохранить функцию в Backbone.js:
saveCountry: function() {
this.model.save({},{
success: function(model, response) {
console.log('success! ' + response);
},
error: function(model, response) {
console.log('error! ' + response);
}
});
this.render();
return false;
},
PHP возвращает строку JSON:
{"response": "Model saved!"}
После PUT получите ошибку в качестве ответа, потому что к модели добавляется "ответ":
Unknown column 'response' in 'field list'
Почему ответ добавлен в модель и как ее предотвратить?
Ответы
Ответ 1
Из справочной документации по модели save
:
Установить хэш атрибутов модели и синхронизировать модель с сервером. Если сервер возвращает хэш атрибутов, который отличается, состояние модели будет снова установлен. http://documentcloud.github.com/backbone/docs/backbone.html#section-41
Что нужно сделать, чтобы заставить его работать: не возвращайте {server] с сервера. Просто верните успех (статус 200) без содержимого.
Если сохранение не сработало, верните JSON с ошибками, а Backbone вызовет событие ошибки на вашей модели с предоставленным JSON (см. http://documentcloud.github.com/backbone/docs/backbone.html#section-41 и http://documentcloud.github.com/backbone/docs/backbone.html#section-145).
Ответ 2
Просто чтобы воскресить древнюю нить...
Не всегда возможно/желательно изменить ответ, который вы возвращаете с сервера.
Другим решением является переопределение parse в модели, чтобы позаботиться об этом. Для вашей ситуации, когда ответ не подходит для ВСЕХ ваших моделей, вы можете сделать это в суперклассе.
MyModel = Backbone.Model.extend({
parse: function(data) {
delete data["success"];
return data;
}
});
Address = MyModel.extend({
saveCountry: function() {
this.model.save({},{
success: function(model, response) {
console.log('success! ' + response);
},
error: function(model, response) {
console.log('error! ' + response);
}
});
this.render();
return false;
},
...
});