2013-08-01 5 views
10

My POST e PUT restituiscono lo stato corrente dell'entità sul server. Come posso comunicare a Restangular di aggiornare il suo oggetto modello dopo la chiamata al server?Come aggiornare l'oggetto del modello Restangular con la risposta del server?

Nel caso in cui - perché? Perché durante il salvataggio/aggiornamento il server potrebbe aver calcolato alcuni campi. Perché potrebbero esserci stati aggiornamenti concorrenti da parte di altri client e voglio essere sicuro che il client che sta aggiornando sia aggiornato.

Finora ho trovato solo questo:

var res = {foo: "bar"}; 
var cb = function(response) { 
    $.extend(res, response); 
} 
// POST/create 
Restangular.all("resource").post(res).then(cb); 

// PUT/update 
res.put().then(cb); 

Sembra così sporco e comune allo stesso tempo, che ho il sospetto che ci deve essere un modo migliore.

EDIT

Il codice sopra illustrati solo due azioni distinte. Il mio obiettivo è non per inviare l'aggiornamento al server dopo aver creato l'entità, ma lo stato di aggiornamento sul client. Sincronizzazione dello stato con il server, se lo desideri.

quando posto un oggetto:

var res = {foo: "bar"}; 
Restangular.all("resource").post(res); 

risposta Server ha un corpo con:

{"foo": "bar", "id": 15} 

... poi vorrei Restangular aggiornare e restangularize dell'oggetto res automaticamente, quindi ha l'ID, può essere put() ecc.

Ora uno scenario diverso/complementare. Quando ho messo un oggetto Restangular:

var res = Restangular.one("resource", 15).get(); 
// returns {foo: "bar", id: 15} 
res.put(); 

Il server risponde sempre con lo stato corrente dell'oggetto, che può essere:

{"foo": "buzz", "id": 15} 

... quindi vorrei Restangular per aggiornare automaticamente dopo res questo PUT.

+2

piacerebbe davvero vedere una risposta a questo. @ mgonto, c'è una ragione specifica per cui ciò non accade già? Forse le implementazioni REST predefinite non restituiscono dati dopo POST e PUT, solo un codice di stato? – jlb

+1

Sì, non vi è alcuna garanzia che un servizio web RESTy restituisca l'oggetto in questione dopo che è stato creato, modificato, ecc. Il modulo comune per questo è semplicemente: $ scope.foo.put(). Then (function success (newFoo) {$ scope.foo = newFoo;}). –

risposta

4

Sono il creatore di Restangular.

Se ho capito bene, vuoi prima fare il post e poi fare il put? In tal caso si potrebbe fare qualcosa del tipo:

var res = {foo: 'bar'}; 
Restangular.all('resource').post(rest).then(function(response) { 
    res = response; 
    res.put() 
}) 

Non so se ho capito correttamente.

spero che funziona

+0

Grazie per la risposta, non è il mio problema però. Sono due azioni separate. Modificherò la domanda con maggiori dettagli. –

+1

Penso che ciò che vuole sia per qualsiasi modifica lato server (come l'aggiornamento di data e ora o il tipo di modifica dell'oggetto modificato) per aggiornare automaticamente o facilmente l'oggetto client senza doverlo fare da '.then() '. Non è possibile impostarlo direttamente poiché si perderebbero informazioni aggiuntive sul modello e si deve usare qualcosa come '$ .extend()' – John

+4

Ehi, dopo la modifica è possibile eseguire _.extend o utilizzare la nuova funzione su Restangular 1.2. 0 $ oggetto. res = res.put(). $ oggetto; – mgonto

0

Prova questa:

res.put().then(function(data) { 
    angular.extend(res, data); 
}); 
Problemi correlati