Backbone.js - model.save() не запускает запрос PUT
У меня есть базовое приложение, использующее Backbone.js, которое не выполняет PUT-вызовы (модель обновления). Из внешнего интерфейса я называю функцию моделей save
не выполняет PUT-вызов; однако, если я заменяю его на destroy
, он вызывает вызов DELETE в конец. Кто-нибудь может понять, что может быть проблемой? Функция, которая не запускает запрос PUT, является функцией saveTask
.
App.Views.Task = Backbone.View.extend({
template: _.template("<label>ID:</label><input type='text' id='taskId' name='id' value='<%= _id %>' disabled /><br><label>Title:</label><input type='text' id='title' name='title' value='<%= title %>' required/><br><label>Content:</label><input type='text' id='content' name='content' value='<%= content %>'/><br><button class='save'>Save</button>"),
events: {
"change input":"change",
"click .save":"saveTask"
},
render: function(eventName){
$(this.el).html(this.template(this.model.toJSON()));
//console.log(this.generateTemplate());
return this;
},
change: function(event){
var target = event.target;
console.log('changing ' + target.id + ' from: ' + target.defaultValue + ' to: ' + target.value);
change[target.name] = target.value;
this.model.set(change);*/
},
saveTask: function(){
this.model.set({
title:$("#title").val(),
content:$("#content").val()
});
if(this.model.isNew()){
App.taskList.create(this.model);
} else {
this.model.save({});
}
}
});
Ответы
Ответ 1
Если ваша модель новая, то в то время, когда вы ее сохраните, она будет запускать почтовый метод.
Если ваша модель, однако, не является новой и вы ее обновляете, она запускает PUT.
если это не работает для вас, это может быть связано с тем, что ваша модель не имеет свойства id, если вы используете идентификатор с другим именем, например taskID, то в вашей модели вам необходимо установить idAttribute taskID, поэтому базовая система использует это свойство как Id, и все будет нормально.
вот так:
var Task= Backbone.Model.extend({
idAttribute: "taskId"
});
вот ссылка на документацию по Idattibute
http://backbonejs.org/#Model-idAttribute
также может возникнуть проблема {} в вызове сохранения
попробуйте просто
this.model.save();
вместо
this.model.save({});
Ответ 2
Я считаю, что модель всегда ожидает параметр параметров, а также, вероятно, обратные вызовы
this.model.save(null, {
success: function (model, response) {
//
},
error: function () {
//
}
});
Если вы посмотрите на Backbone src, вы заметите, что тоже...
======
// Set a hash of model attributes, and sync the model to the server.
// If the server returns an attributes hash that differs, the model's
// state will be `set` again.
save: function (key, val, options) {
var attrs, method, xhr, attributes = this.attributes;
// Handle both `"key", value` and `{key: value}` -style arguments.
if (key == null || typeof key === 'object') {
attrs = key;
options = val;
} else {
(attrs = {})[key] = val;
}
options = _.extend({
validate: true
}, options);
// If we're not waiting and attributes exist, save acts as
// `set(attr).save(null, opts)` with validation. Otherwise, check if
// the model will be valid when the attributes, if any, are set.
if (attrs && !options.wait) {
if (!this.set(attrs, options)) return false;
} else {
if (!this._validate(attrs, options)) return false;
}
// Set temporary attributes if `{wait: true}`.
if (attrs && options.wait) {
this.attributes = _.extend({}, attributes, attrs);
}
// After a successful server-side save, the client is (optionally)
// updated with the server-side state.
if (options.parse === void 0) options.parse = true;
var model = this;
var success = options.success;
options.success = function (resp) {
// Ensure attributes are restored during synchronous saves.
model.attributes = attributes;
var serverAttrs = model.parse(resp, options);
if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
return false;
}
if (success) success(model, resp, options);
model.trigger('sync', model, resp, options);
};
wrapError(this, options);
method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
if (method === 'patch') options.attrs = attrs;
xhr = this.sync(method, this, options);
// Restore attributes.
if (attrs && options.wait) this.attributes = attributes;
return xhr;
},
Ответ 3
В моем случае это происходит из-за валидации. Поскольку я сохраняю модель, она проверяет все атрибуты модели, и коллекция, которую я использую для интерфейса листинга, не требует всех атрибутов модели.
Я столкнулся с теми же проблемами и поиском в Google, и нашел ваш вопрос и прочитал решение и комментарии. Когда я понимаю, что в обновленных базовых спецификациях упоминается, что когда model.save() выполняется перед запросами модели, он сначала вызывает подтвердите, и если проверка будет успешной, чем это произойдет, другие мудрые не удастся, и именно по этой причине она не отображает сетевой запрос на вкладке chrome debugger network.
Я пишу решение для случая, с которым сталкиваюсь, другие могут столкнуться с различными проблемами.
Ответ 4
Backbone функция синхронизации - это то, что я использовал. Вы должны передать "обновление" в качестве первого параметра (параметр "метод" ).