Backbone.js используют разные URL-адреса для сохранения и выбора модели
У моего back-end есть две отдельные страницы, одна для обработки запроса сохранения модели, а другая для выборки модели.
Каков наилучший способ вызова save() и fetch() для использования разных URL-адресов? Спасибо.
Edit:
Изучив аннотированный источник, я вижу, что на самом деле можно поставить хэш options
fetch и сохранить
//taken from backbone source:
save : function(attrs, options) {
options || (options = {});
if (attrs && !this.set(attrs, options)) return false;
var model = this;
var success = options.success;
options.success = function(resp, status, xhr) {
if (!model.set(model.parse(resp, xhr), options)) return false;
if (success) success(model, resp, xhr);
};
options.error = wrapError(options.error, model, options);
var method = this.isNew() ? 'create' : 'update';
return (this.sync || Backbone.sync).call(this, method, this, options);
},
В сохранении, какая цель служит attrs
? Я только что вызывал myModel.save(), не передавая ничего, и он всегда правильно хэшировал мои атрибуты модели. Но теперь, когда я хочу предоставить "save url", и у меня возникает соблазн позвонить
myModel.save(undefined, {
url: 'myPath'
})
с параметром undefined требуется "пропустить" первый параметр attrs
.
Ответы
Ответ 1
Если вы читаете источник, у вас, вероятно, уже есть рабочее решение. У вас по существу есть два варианта (возможно, больше) -
- Пропустить URL-адрес в файле save()/fetch()
save() принимает два параметра attr и параметры
attr - хэш атрибутов модели и используется для обновления модели перед сохранением.
например.
myModel.save(attrs)
эквивалентно
myModel.set(attrs)
myModel.save()
Второй параметр - это хэш параметров, который передается до this.sync() (а затем Backbone.sync, а затем $.ajax) - установка URL-адреса в этом хеше будет работать должным образом.
Вы можете передать false, undefined или {} в качестве первого параметра для пропуска обновления.
- Переопределить Backbone.sync
Вместо того, чтобы каждый раз, когда вы вызываете save() или fetch(), записываете свою собственную функцию синхронизации, вместо URL-адреса, чтобы вычислить URL-адрес для вас, делегат оригинальной Backbone.sync для тяжелого подъема
например. (Эта функция синхронизации добавляет/сохраняет URL-адрес в действиях CREATE, UPDATE и DELETE)
function mySyncFunction(method, model, options){
if(method=='GET'){
options.url = model.url;
}else{
options.url = model.url + '/save';
}
return Backbone.sync(method, model, options);
}
Чтобы использовать свой собственный метод синхронизации, просто объявите его как часть вашей модели.
var myModel = Backbone.Model.extend({
...
"sync": mySyncFunction,
...
});
Ответ 2
Ответ Gingerhendrix охватывает базы, но я подумал, что стоит остановиться на методе передачи значения параметра save
/delete
/fetch
.
Вместо того, чтобы забивать ваш код URL-адресами в каждом месте, которое вы вызываете одним из этих методов, вы также можете переопределить метод на своей модели, а затем делегировать обратно исходному методу Backbone.Model
, например:
var MyModel = Backbone.Model.extend({
save: function(attributes, options) {
options = _.defaults((options || {}), {url: "http://your.save.url.com/"});
return Backbone.Model.prototype.save.call(this, attributes, options);
},
// same thing for fetch and delete to give them different urls...
}
Затем вы можете вызвать метод в своем коде, не беспокоясь о том, чтобы запомнить установку url
в параметрах.
Ответ 3
Я хочу, чтобы очистить ответ от @gingerhendrix: вы можете передать url для параметров в save, и он перейдет непосредственно к запросу xhr (это не очевидно из документации или исходного кода или из ответа, поэтому я отправляю ot как отдельный ответ)
model.save({}, {url: '/custom-url'});
Ответ 4
Если у вас есть модель и коллекция, например: -
MyModel = Backbone.Model.extend({
url: function(){ "API/"
return "API/MyModel/" +this.get("id");
}
});
MyCollection = Backbone.Collection.extend({
model: MyModel ,
url: "API/MyModels"
});
чтобы получить коллекцию, просто вызовите
MyCollection.fetch({
success: function(){
//do something here
},
error: function(){
//Handle your error
}
});
Чтобы сохранить модель, если у вас есть идентификатор модели и
вы создали экземпляр своей коллекции (назовем ее myCollection).
var model = myCollection .get(id);
model.save(
model.attributes,
{
success: function (model, response) {
//do something on success
},
error: function (model, response) {
//handle the error
}
}
);