2012-04-11 7 views
10

Mam obiekt, który jest również zapisany na serwerze i jestem tworzenie modelu szkieletu z tego obiektu.W jaki sposób poinformować kręgosłupa, że ​​model nie jest nowy

Ale kiedy zapiszę model, robi on żądanie PUT, co nie jest tym, czego chcę. Jak powiedzieć Backbone, że dane są już na serwerze bez pobierania?

+0

Żądania aktualizacji map szkieletowych do PUT http://documentcloud.github.com/backbone/#Sync, więc jakiego zachowania się spodziewać? – nikoshr

+0

Myślałem, że żądania aktualizacji zostały zmapowane na POST, ale PUt został użyty do stworzenia nowego przedmiotu. – archmage

+0

Jeśli ktoś chce wymusić żądanie POST, istnieje [wiele alternatyw] (http://stackoverflow.com/a/41091957/1218980). –

Odpowiedz

18

Backbone określa nowość modelu przez checking if an id is set:

isNewmodel.isNew()

Czy ten model został zapisany na serwerze jeszcze? Jeśli model nie ma jeszcze modelu id, uznaje się go za nowy.

A po zapisaniu modelu

  • jeśli jest nowy, żądanie POST będzie emitowany,
  • jeśli jest to update (id został ustawiony), żądanie PUT zostanie wysłany

Backbone Sync documentation


I jak zauważył @JayC w komentarzach:

Jeśli istnieje problem, że identyfikator nie może być dosłownie id, można użyć idAttribute powiedzieć, który jest „tożsamość” lub pole klucza.

+4

Uwaga: jeśli wystąpił problem polegający na tym, że id nie może być dosłownie "id", możesz użyć idAttribute. http://documentcloud.github.com/backbone/#Model-idAttribute, aby określić, która to "tożsamość" lub pole klucza. – JayC

+0

Pytanie: Mam model, który jest nowy (bez id), ale ma inne pola ustawione w interfejsie użytkownika. kiedy zapisuję model, wysyła on żądanie PUT. Nie powinien wysyłać żądania POST, ponieważ nie ma identyfikatora? – archmage

+2

@archmage Dziwne, powinien to być POST. Sprawdź ten Fiddle http://jsfiddle.net/jq98Z/, odtwarza oczekiwane zachowanie. Może przeszedłeś domyślną synchronizację lub mapowanie akcji? – nikoshr

-1

Dodanie moich dwóch centów tutaj, mam nadzieję, że uniknie się ciągnięcia włosów musiałem zrobić.

Ustawianie właściwości id danego modelu bezpośrednio przez konstruktora false lub null nie załatwi, trzeba rzeczywiście usunąć go z pamięci poprzez poprzez usunięcie

Na przykład, po prostu starałem się skopiować atrybuty z jednego modelu wpisz do innego typu jako nowy model:

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 
    ... 
Powiązane problemy