Магистраль: сохранение всей коллекции на сервере, не относящемся к RESTful
Я просматривал несколько сообщений о том, как сохранить коллекцию Backbone с использованием сервера без RESTful, и я все еще немного запутался. Я создал коллекцию, где я переопределил метод toJSON
, чтобы настроить мои данные для публикации в моем API ("/api/entity/735/request/personDelete"
в настоящее время заменен на jsfiddles/echo/json). Поэтому я создал метод save
, который использует Backbone.sync
, на success
Я выхожу из любого ответа, и объект пуст, не уверен, где вещи теряются или что я делаю неправильно; может ли кто-нибудь дать мне некоторое руководство? Просто хотел бы, чтобы этот пример работал, поэтому я могу использовать что-то вроде этого в будущем.
JS
var PersonCollection = Backbone.Collection.extend({
model: PersonModel,
url: function() {
// Dummy JSFiddle endpoint
// Example non-RESTful url "/api/entity/735/request/personDelete"
return '/echo/json/';
},
/**
* Override toJSON to loop through collection models making
* custom objects containing specific attributes to be posted.
*/
toJSON: function() {
console.log(this.models);
var plucked = this.models.map(function(model) {
return _.pick( model.toJSON(), ["id","name", "teams"] )
});
console.log(plucked);
return plucked;
},
save: function(options) {
Backbone.sync('create', this, {
success: function(data, textStatus, jqXHR) {
console.log('Saved!', data);
}
});
}
});
JSFiddle: http://jsfiddle.net/kyllle/f1h4cz7f/3/
Ответы
Ответ 1
Вам не нужно заставлять себя использовать sync
, если это вам не поможет. sync
позволяет экономить время в общих сценариях.
Как вы можете видеть в аннотированном sync
кодексе, он в итоге просто вызывает jQuery.ajax и включает в себя логику, чтобы помочь с бэкэндами RESTful.
Также он вызывает некоторые события, которые вы могли бы или не могли слушать в других частях вашего приложения, например request
(когда запрос был сделан) и sync
(когда запрос был успешно завершен) или error
(если запрос не выполнен)
Все это вы можете сделать из своего приложения, если переосмысление sync
неинтересно.
Подготовьте свои данные, позвоните $.ajax
, чтобы отправить данные на ваш сервер и, при желании, trigger
базовые события, если вы собираетесь их слушать.
Ответ 2
Вы можете обернуть свою коллекцию внутри базовой модели.
var CollectionWrapper = Backbone.Model.extend({
url: "/echo/json"
});
а затем вы можете использовать model.save() и/или Backbone.sync(), поскольку Backbone намеревается использовать его.
Смотрите этот ответ: "How" для сохранения целой коллекции в Backbone.js - Backbone.sync или jQuery.ajax?