Полностью удалить атрибут из модели Backbone.js

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

Я старался model.unsetиз этого вопроса, но когда я распечатываю объект, атрибут, который я пытаюсь удалить, все еще отображается, только со значением null.

Мне нужно, чтобы атрибут полностью исчез.

Моя основная структура:

model.unset("AttrName", "silent");

3 ответа

Решение

Проблема в том, что вы используете параметры для unset неправильно. "Silent" должен быть частью хэша опций, а не отдельным параметром. Это работает:

model.unset("AttrName", { silent: true });

Причину странного поведения можно увидеть из аннотированного источника:

unset: function(attr, options) {
  (options || (options = {})).unset = true;
  return this.set(attr, null, options);
},

unset Метод предполагает, что его options Параметр является объектом и пытается либо создать, либо изменить его, а затем передать его set метод. Если вместо этого вы передаете строку, то непреднамеренный эффект кода состоит в том, чтобы установить для атрибута значение null, а не для его сброса.

Переопределите метод toJSON вашей модели и включите только те атрибуты, которые вы хотите отправить.

Обновлено: (добавлен пример кода)

При расширении модели добавьте функцию toJSON и верните объект с требуемыми атрибутами:

{
    toJSON : function() {
        return {
            name: this.get('name'),
            age: this.get('age'),
            phoneNumber: this.get('phoneNumber')
        };
    }
}

Вы можете попробовать создать объект только с теми свойствами, которые вам нужны (и отправить их):

serializeModel: function() {
  return {
    email: this.$("#email").val(),
    password: this.$("#password").val()
  }
}
Другие вопросы по тегам