Отправить только измененные поля в базовой модели

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

Как лучше всего контролировать, какие поля можно отправлять на сервер, используя только эти библиотеки, которые можно использовать на нескольких страницах моего приложения? Будет полезно что-то вроде многоразовой функциональности.

я пытался model.changedAttributes() функция, которая не работает должным образом. В большинстве случаев это возвращает ложь. У меня есть следующий код, где данные формы сериализуются с использованием сифона, а затем преобразуются в формат моего приложения для отправки в API.

formSave: function(e) {
    var data = changeToWriteApiFormat(Backbone.Syphon.serialize($(e.currentTarget).closest('form.event_form')[0]));
    this.model.clear();
    this.model.id = this.parentObj.model.id;

    this.model.set(data);

    if (this.model.isValid(true)) {
      this.model.save(removeObjIndexCollection(data), {
          url: this.model.url().replace(gc.readApiUrl, gc.publishApiUrl),
          patch: true,
          beforeSend: ToolsHelper.setPublishHeader,
          success: function(model, response) {
            $('#event_success').show();
            $('#event_failure').hide();
          },
          error: function(model, response) {
            $('#event_failure').show();
            $('#event_success').hide();
          }

        }
      }

1 ответ

Решение

model.changedAttributes() работает только в том случае, если ранее для this.model были установлены некоторые атрибуты, но поскольку вы очищаете их с помощью this.model.clear(); он вернет ложь.

Также "save" будет выполнено только в том случае, если validate возвращает valid, вам не нужно вызывать isValid extra.

Атрибут "patch:true" является правильным, но также будет работать, только если вы установили предыдущие значения.

попробуй это:

formSave: function(e) {
    var data = changeToWriteApiFormat(Backbone.Syphon.serialize($(e.currentTarget).closest('form.event_form')[0]));

        this.parentObj.model.save(removeObjIndexCollection(data), {
           url: this.model.url().replace(gc.readApiUrl, gc.publishApiUrl),
           patch: true,
           beforeSend: ToolsHelper.setPublishHeader,
           success : function(model, response) {
               $('#event_success').show();
               $('#event_failure').hide();
           },
           error : function(model, response) {
               $('#event_failure').show();
               $('#event_success').hide();
           }

         }
}

Изменить: вот пример измененных атрибутов:

var model = new Backbone.Model();

model.set({
    val1 : 'init',
    val2 : 'init'
});

// .. whatever

var newChangesFromForm = {
    val2 : "changed",
    val1 : 'init' // won't be set, because it's the same value
};
model.on('change', function() {
    var changes = model.changedAttributes();

    alert(JSON.stringify(changes));
});
model.set(newChangesFromForm);
Другие вопросы по тегам