2011-08-25 19 views
11

Korzystając z usługi Backbone.JS, mogę skutecznie tworzyć nowe modele i zapisywać je na serwerze. Pomyślnie dokonują aktualizacji wywołania ajax i subskrybowanych elementów interfejsu użytkownika. Problemem, który napotkam, jest to, że nie znam identyfikatora nowo utworzonego obiektu.Jak pobrać identyfikator modelu podczas tworzenia nowego?

Widzę w nagłówkach odpowiedzi dla moich wywołań tworzenia, że ​​serwer zwróci nagłówek lokalizacji, taki jak: Location https://localhost/rest/beta/mobile/footer/OTo3Njow z ostatnim parametrem będącym nowo utworzonym identyfikatorem.

Jak mogę uzyskać ten identyfikator bez przesłonięcia domeny backbone.sync? Jeśli muszę zastąpić metodę backbone.sync, jaka jest najczystsza metoda?

UPDATE Wygląda jak moja organizacja używa starszej backbone.js w którym metoda parse modeli nie zawiera odniesienia do obiektu użyciem nagłówków XHR, inaczej nie mogłem złapać identyfikator i zrobić tam przypisywania.

Odpowiedz

10

Serwer powinien odesłać Obiekt JSON zawierający model id oraz wszelkie inne atrybuty, które chce zaktualizować. Jeśli tak, Backbone automatycznie pobierze identyfikator.

Jeśli to nie jest opcja, należy zastąpić Backbone.sync, ponieważ wtedy interfejs API (który komunikuje nowy identyfikator w nagłówku lokalizacji zamiast z treścią odpowiedzi) nie jest zgodny z tym, co Backbone obsługuje po wyjęciu z pudełka.


Jeśli serwer już to robi, a chcesz tylko uzyskać identyfikator, to zależy od tego, kto musi wiedzieć. Jeśli jest to kod wywołujący model.save(), to może przejść w sukces wywołania zwrotnego:

model.save({}, { 
    success: function(){ 
     // do something with model.id 
    } 
}); 

jeśli sama modelka musi być powiadomiony kiedy dostaje identyfikator, można użyć inicjator:

var MyModel = Backbone.Model.extend({ 
    initialize: function(){ 
     this.bind("change:id", function(){ 
      // … 
     }); 
    } 
}); 
1

Rozwiązałem to przez przeciążenie param sukces w backbone.sync

// Return XHR on success 
params.success = function(response, text, XHR) { 
    if(_.isFunction(model.xhrParse)) { model.xhrParse.call(model, response, XHR); } 
    success.call(model, response); 
} 

i dodając nową metodę do mojego modelu bazowego "xhrParse":

xhrParse: function(resp, XHR) { 
    var locationHeader = XHR.getResponseHeader('Location'); 
    if(locationHeader && !this.id) { 
    var xplode = locationHeader.split("/"); 
    this.id = xplode[xplode.length - 1]; 
    } 
    return resp; 
} 
+2

Użyj 'this.set ('id', ...)'. Kiedy zmienia się identyfikator modelu, muszą się zdarzyć inne rzeczy - identyfikator jest aktualizowany w obiekcie atrybutów modelu, jeśli model jest w zbiorze, kolekcja musi zostać powiadomiona, że ​​ma identyfikator itp. – s4y

+0

Bardzo dobry połów. Dziękuję Ci. –

Powiązane problemy