2017-01-03 3 views
2

Я вызываю метод set несколько раз и меняю несколько атрибутов. Затем я хочу отправить измененные данные на сервер с {patch: true}.Могу ли я сохранить измененные атрибуты модели после нескольких наборов

Я могу использовать model.save(attrs, {patch: true});, но я не знаю attrs. Я не могу использовать model.toJSON() (ненужные поля) или model.changedAttributes() (только последний набор), чтобы получить attrs.

Как это сделать?

+0

Что вы точно хотите послать сервер, только измененный атрибут или все атрибуты, присутствующие в модели или некоторые из атрибутов – Kenny

+0

Can вы показываете нам в примере – Kenny

+0

Только измененные атрибуты –

ответ

2

В соответствии с changedAttributes:

Необязательно, хэш хэши внешних атрибутов может быть передан, возвращая атрибуты в этом хэше, которые отличаются от модели.

Итак, вы можете попробовать кэшировать состояние модели, используя toJSON, прежде чем вы начнете изменять. После того как ваши изменения будут выполнены, передайте новое состояние методу changedAttributes для извлечения хэша измененных атрибутов, а затем отправьте запрос на исправление. Что-то вроде

var oldAttrs = model.toJSON(); 

// ...do modifications here 

var changedAttrs = model.changedAttributes(oldAttrs); 
dataTosend = model.pick(_.keys(changedAttrs)); 
model.save(dataTosend, {patch: true}); 
+0

Спасибо, похоже, это самый лучший способ на данный момент. –

0

Bind слушателем для модели

Если вы устанавливаете значение в представлении, слушатель должен быть как (лучше записать его в инициализации функции)

this.listenTo(this.model, "change", this.onModelValueChange); 

И вашей функции прослушивателя

onModelValueChange: function(model, args) { 
     model.save(args.changed, {patch: true}); 
    } 
+0

Но я хочу позвонить 'save' только один раз –

+0

Я думаю, что необходимо создать проблему на магистральном github ... На мой взгляд. Я думаю, было бы хорошо, если бы «сохранить» без attrs по первому параметру сохранить все измененные атрибуты. –

0

Хотя TJ has the right answer, у меня есть лучший способ добиться того, что он предложить.

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

this.master = this.model.clone(); 
// ... then changes are made to this.model 

Когда вы готовы к сохранению, используйте мастер-модель для сравнения атрибутов и получения изменений напрямую.

var changes = this.master.changedAttributes(this.model.attributes); 
if (changes !== false) this.model.save(changes, { patch: true }); 

С этим, вы можете пропустить dataTosend = model.pick(_.keys(changedAttrs)) совсем так changes уже является объектом всех разногласий с начальным состоянием мастер-модели.

Если это вид, который используется повторно после того, как модели сохранения:

var View = Backbone.View.extend({ 
    initialize: function() { 
     this.updateMaster(); 
    }, 

    saveChanges: function() { 
     var changes = this.master.changedAttributes(this.model.attributes); 
     if (changes !== false) { 
      this.model.save(changes, { 
       patch: true, 
       context: true, 
       success: this.updateMaster 
      }); 
     } 
    }, 

    updateMaster: function() { 
     this.master = this.model.clone(); 
    }, 
});