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
                                    }
                                }
                            );