2013-08-01 4 views
10

Moje POST i PUT zwracają bieżący stan encji jak widać na serwerze. Jak mogę powiedzieć Restangular, aby zaktualizować obiekt modelu po wywołaniu serwera?Jak zaktualizować obiekt modelu restarta z odpowiedzią serwera?

Na wszelki wypadek - dlaczego? Ponieważ podczas składowania/aktualizacji serwer mógł obliczyć kilka pól. Ponieważ mogły istnieć współbieżne aktualizacje przez innych klientów i chcę mieć pewność, że klient, który jest obecnie aktualizowany, jest aktualny.

Jak dotąd znalazłem tylko to:

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); 

Wydaje się więc brudne i powszechne w tym samym czasie, że podejrzewam, że musi być lepszy sposób.

EDIT

Powyższy kod pokazuje tylko dwie odrębne czynności. Moim celem jest , a nie wysyłanie aktualizacji do serwera po utworzeniu encji, ale aktualizacja stanu na kliencie. Synchronizacja stanu z serwerem, jeśli chcesz.

Kiedy POST obiektu:

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

Odpowiedź serwera ma ciało:

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

... to chciałbym Restangular zaktualizować i restangularize obiekt res automatycznie, a więc ma identyfikator może być put() itp.

Teraz inny/uzupełniający scenariusz. Kiedy kładę Restangular obiektu:

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

Serwer zawsze odpowiada aktualnym stanem obiektu, który może być:

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

... więc chciałbym Restangular zaktualizować res automatycznie po to PUT.

+2

naprawdę chciałbym zobaczyć odpowiedzi do tego. @mgonto, czy istnieje szczególny powód, dla którego tak się już nie stało? Może domyślne wdrożenia REST nie zwracają danych po testach POST i PUT, a jedynie kod statusu? – jlb

+1

Tak, nie ma gwarancji, że usługa internetowa RESTy zwróci obiekt, o którym mowa, po jego utworzeniu, zmianie itp. Powszechną formą jest po prostu: $ scope.foo.put(). Then (funkcja success (newFoo) {$ scope.foo = newFoo;}). –

Odpowiedz

4

Jestem twórcą Restangular.

Jeśli dobrze Cię rozumiem, chcesz najpierw zrobić post, a następnie wykonać instalację? W takim przypadku możesz zrobić coś takiego:

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

Nie wiem, czy rozumiem poprawnie.

Nadzieja to działa

+0

Dziękuję za odpowiedź, ale to nie jest mój problem. Są to dwa oddzielne działania. Będę edytować pytanie bardziej szczegółowo. –

+1

Myślę, że to, czego chce, to każda zmiana po stronie serwera (np. Aktualizacja znaczników czasu lub modyfikacji typu "modyfikowany przez") w celu automatycznego lub łatwego aktualizowania obiektu klienta bez konieczności wykonywania go z metody '.then() '. Nie możesz go ustawić bezpośrednio, ponieważ utracisz dodatkowe informacje o modelu i musisz użyć czegoś w stylu '$ .extend()' – John

+4

Hej, po edycji możesz albo zrobić _.rozmiar lub użyć nowej funkcji w Restangular 1.2. 0 $ obiekt. res = res.put(). $ obiekt; – mgonto

0

Spróbuj tego:

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