2013-03-04 31 views
7

używam klucza kompozytowego w moim modelu i generowania identyfikatora na podstawie mojego klucza kompozytowego:Backbone robi POST zamiast umieścić na aktualizacjach gdy klucz kompozytowy służy

app.Assignment = Backbone.Model.extend({ 
    idAttribute : [ 'personId', 'jobId' ], 
    parse : function(resp) { 
     resp.id = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
}); 

ale Backbone nadal uważa, że ​​wszystkich przypadkach przydziału są nowe, mimo że ustawiam identyfikator w metodzie parsowania podczas pobierania z interfejsu API. W rezultacie Backbone nie robi żadnych DELETE i wykonuje POST zamiast PUT na aktualizacjach. Jak mogę obejść ten problem lub co jest "właściwą drogą", aby to zrobić?

Aktualizacja:

Wygląda zastępując resp.id z this.id rozwiązuje ten problem.

+1

Szkielet nie obsługuje kluczy złożonych, więc definiowanie 'idAttribute' jako tablicy jest niepoprawne. Każdy model musi mieć jedno pole identyfikatora. Jak wyglądają adresy URL Twoich zasobów? – jevakallio

+0

Obsługuje klucze kompozytowe: https://github.com/documentcloud/backbone/pull/1558 faktycznie rozwiązałem go, wykonując this.id = ... zamiast resp.ide = ... –

+5

Ah, jesteś przy użyciu https://github.com/caseywebdev/backbone-composite-keys. Byłoby sensowne wspomnieć o tym w pytaniu. – jevakallio

Odpowiedz

2

Wyniki sposobem obejmującym Backbone.Model parse są przekazywane do metody set, w którym ustawia się atrybutów modelu. Punktem zamieszania dla ciebie myślę, że identyfikator modelu nie jest jednym z jego atrybutów; jest to jedna z jego właściwości: ,.

Więc, co się dzieje, jest to:

  1. Twój surowe dane pochodzą z serwera i jest przekazywana do parse
  2. te same dane surowe, teraz zwiększona z atrybutem id, jest przekazywana do set
  3. set wygląd i swoją idAttribute ([ 'personId', 'jobId' ]) oraz wszystkie klawisze w surowych danych
  4. Ponieważ żaden z tych kluczy dopasować idAttribute, n jeden z nich jest używany jako identyfikator modelu, a tym samym otrzymujesz swój problem.

Twoje rozwiązanie ustawiania this.id wewnątrz parse prace, ale może to spowodować problemy w dół drogi bo parse jest generalnie przeznaczone do pracy na jego wejście (dane surowe), aby nie modyfikować samego modelu; ta część ma nastąpić później, gdy zostanie wywołana set. Czystsze zamiast być rozwiązaniem byłoby zrobić coś jak następuje:

app.Assignment = Backbone.Model.extend({ 
    // note that no idAttribute is specified, leaving it as the default "id" 
    parse : function(resp) { 
     resp.id = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
} 

Albo, jeśli chcesz inny atrybut ID ...

app.Assignment = Backbone.Model.extend({ 
    idAttribute: 'personAndJobId', 
    parse : function(resp) { 
     resp.personAndJobId = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
} 
0

Oprócz kwestii idAttribute tutaj, można zawsze siła Szkielet, aby użyć określonej metody HTTP za pomocą opcji typu przekazanych do save().

model.save(null, { type: 'put' })

0

Nigdy nie pracować z kompozytu ID w sieci szkieletowej, ale myślę, że to może być łatwym odpowiedź na Twój problem:

initialize: function() { 
     this.set("id", this.generateID()); 
}, 
generateID = function() { 
    return this.personId + + "_" + this.jobId; 
} 

Z tym kodem w was definicji modelu Backbone jesteś tworzenie unikalnego identyfikatora dla każdego modelu i nie powinieneś mieć problemów z aktualizacją i zapisać go (i nie musisz ustawiać żadnego idAtrybutu).