Вопрос по – Метод запроса PATCH в Backbone.js

18

Как правильно выполнятьPATCH запросить при сохранении атрибутов модели в Backbone.js?

Вау, переполнение стека не позволяет размещать вопросы с заглавными словами в заголовке. Умный. Burnash

Ваш Ответ

3   ответа
9

Джеймс Кропчос ответ Я хочу добавить следующее, потому чтоэто крадет несколько часов от меня и может кому то поможет

Если вы используетеmodel.save(attributesToPatchObject,{patch: true}) как это возможно начиная с backbone v.0.9.9, как указано в ответе Джеймса Кропхоса, вы можете задаться вопросом, как определить, какие атрибуты изменились с момента последнего вызоваmodel.save() передать их какattributesToPatchObject который является первым аргументом отmodel.save() (или жеmodel.fetch() если вы не сохранили модель в последнее время).

Сам Backbone не отслеживал эти атрибуты. Я думал методmodel.changedAttributes() может соответствовать, но какдок-док говорит этот метод возвращает

a hash of only the model's attributes that have changed since the last set, or false if there are none

Таким образом, этот способ не подходит для этой потребности. После некоторых исследований я обнаружил, что сама магистраль не отслеживалаunsaved атрибуты (я знаю, это не блестящая находка, если бы я читал документы более внимательно).

я узнал чтоbackbone.trackit это плагин для магистрали, который точно добавляет необходимую функцию в магистраль, добавляя методunsavedAttributes() к модели. Документация по backbone.trackit говорит об этом методе:

Symmetric to Backbone's model.changedAttributes(), except that this returns a hash of the model's attributes that have changed since the last save, or false if there are none. Like changedAttributes, an external attributes hash can be passed in, returning the attributes in that hash which differ from the model.

Это работает так:

//fetch an existing model from server
model.fetch({
  success : function(model, respose, options) {
    //tell backbone.trackit to track unsaved Attributes
    model.startTracking();
  }
});

//now some changes to the model happen
model.set("someProperty", "someValue");

/* save the model to server using the PATCH-Method 
   and only send the unsaved Attributes; 
   in this case only "someProperty" is sent
*/
model.save(model.unsavedAttributes(), {patch: true});

ПосколькуunsavedAttributes() возвращаетсяfalse если нет несохраненных атрибутов, вы можете дополнительно обернутьsave() заявление в условии if, которое проверяет, еслиunsavedAttributes() тогда возвращает что-то другоеfalse и только сделайте ваш PATCH-запрос, если он необходим (потому что что-то изменилось).

ПРИМЕЧАНИЕ. Вам не нужно было звонитьfetch() использоватьstartTracking() так что вы можете использовать этот метод даже с недавно созданными моделями (model.isNew() возвращает true для этой модели), если для этого есть сценарий использования.

Надежды это может сэкономить кому-то немного времени на исследования.

8

Backbone.sync и расширить существующий метод сопоставления

var methodMap = {
    'create': 'POST',
    'update': 'PUT',
    'delete': 'DELETE',
    'read':   'GET',
    'patch':  'PATCH'
};

Вам нужно будет создать свой собственный метод исправления для такой модели, как

Backbone.Model.prototype.patch = function(options) 
{
    // some code here that checks what attributes have changed since last save
    var xhr = (this.sync || Backbone.sync).call(this, 'patch', this, options);
    return xhr;  
}

Я уверен, что вы можете расширить Backbone и включитьOPTIONS а такжеHEAD если вам нужно

Обратите внимание, что даже через jQuery поддерживаются методы PATCH, OPTIONS и HEAD, ваши конечные пользователи & apos; браузер не может.

35

{ patch: true } вsave().

Прочитайте больше:http://backbonejs.org/#changelog

myModel.save(data, {patch:true})Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Burnash

Похожие вопросы