2012-04-11 2 views
10

У меня есть объект, который также сохраняется на сервере, и я создаю модель Backbone для этого объекта.Как сообщить, что модель не является новой

Но когда я сохраняю модель, она делает запрос PUT, чего я не хочу. Как сказать Магистраль, что данные уже находятся на сервере, не делая выборку?

+0

Магистральные карты обновляют запросы к PUT http://documentcloud.github.com/backbone/#Sync, и какое поведение вы ожидаете? – nikoshr

+0

Я думал, что запросы на обновление были сопоставлены с POST, но PUt использовался для создания нового элемента. – archmage

+0

Если кто-то хочет принудительно выполнить запрос POST, существует [несколько альтернатив] (http://stackoverflow.com/a/41091957/1218980). –

ответ

18

Backbone определяет новизну модели по checking if an id is set:

isNewmodel.isNew()

ли эта модель была сохранена на сервере еще? Если модель еще не имеет id, она считается новой.

И когда вы сохраняете модель,

  • , если оно является новым, запрос POST будет выброшен,
  • , если это обновление (идентификатор был установлен), запрос PUT будет отправлен

Backbone Sync documentation


И как отметил @JayC в комментариях:

Если есть вопрос о том, что идентификатор не может быть в буквальном смысле id, вы можете использовать idAttribute сказать, что является «идентичность» или ключевое поле.

+4

Обратите внимание, что если есть проблема, что идентификатор не может быть буквально 'id', вы можете использовать idAttribute. http://documentcloud.github.com/backbone/#Model-idAttribute, чтобы указать, что является «идентификатором» или ключевым полем. – JayC

+0

Вопрос: У меня есть новая модель (нет id), но у нее есть другие поля, установленные в переднем конце. когда я сохраняю модель, она отправляет запрос PUT. Не следует ли отправлять запрос POST, потому что нет идентификатора? – archmage

+2

@archmage Странно, это должен быть POST. Проверьте этот скрипт http://jsfiddle.net/jq98Z/, он воспроизводит ожидаемое поведение. Может быть, вы переопределили синхронизацию по умолчанию или сопоставление действий где-нибудь? – nikoshr

-1

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

Установка свойства Идентификатор модели непосредственно через конструктор к ложным или нуль не будет делать трюк, вы должны фактически удалить его из памяти через с помощью удаления

Например, я просто пытался копировать атрибуты из одной модели тип к другому типу в качестве новой модели:

copy = Trip.clone() 
#doesn't unset the id attribute 
schedule = new models.Schedule(_.extend(copy.attributes, {id:null, trip_id:id}) 
#does unset the id attribute 
delete schedule.id 
schedule.save null, success: => 
    # back from POST vs PUT 
    ... 
Смежные вопросы