Как обновить объект модели Restangular с помощью ответа сервера?

Мои POST и PUT возвращают текущее состояние объекта, видимое на сервере. Как я могу сказать Restangular обновлять свой объект модели после вызова сервера?

На всякий случай - зачем? Потому что во время сохранения / обновления сервер мог вычислить некоторые поля. Потому что, возможно, были одновременные обновления другими клиентами, и я хочу убедиться, что клиент, который в настоящее время обновляется, обновлен.

Пока я нашел только это:

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

Это кажется настолько грязным и распространенным одновременно, что я подозреваю, что должен быть способ получше.

ИЗМЕНИТЬ

Приведенный выше код демонстрирует только два различных действия. Моя цель - не отправлять обновление на сервер после создания объекта, а обновить состояние на клиенте. Если хотите, синхронизируйте состояние с сервером.

Когда я размещаю объект:

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

В теле ответа сервера написано:

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

... тогда я хотел бы, чтобы Restangular обновляла и изменяла прямоугольную форму объекта res автоматически, чтобы у него был идентификатор, может быть put() и т. д.

Теперь другой / дополнительный сценарий. Когда я помещаю прямоугольный объект:

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

Сервер всегда отвечает текущим состоянием объекта, которое может быть:

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

... поэтому я хотел бы, чтобы Restangular обновляла res автоматически после этого PUT.


person Konrad Garus    schedule 01.08.2013    source источник
comment
Очень хотелось бы увидеть ответ на это. @mgonto, есть конкретная причина, по которой этого еще не произошло? Может быть, реализации REST по умолчанию не возвращают данные после POST и PUT, а только код состояния?   -  person jlb    schedule 30.10.2013
comment
Да, нет гарантии, что веб-служба RESTy вернет объект, о котором идет речь, после того, как он был создан, изменен и т. Д. Обычная форма для этого просто: $ scope.foo.put (). Then (function success (newFoo ) {$ scope.foo = newFoo;}).   -  person Glenn Filson    schedule 26.03.2014


Ответы (2)


Я создатель Restangular.

Если я вас правильно понял, вы хотите сначала сделать пост, а потом уже поставить? В этом случае вы можете сделать что-то вроде:

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

Не знаю, правильно ли я понял.

Надеюсь, что это работает

person mgonto    schedule 01.08.2013
comment
Спасибо за ответ, но это не моя проблема. Это два отдельных действия. Отредактирую вопрос более подробно. - person Konrad Garus; 02.08.2013
comment
Я думаю, что он хочет, чтобы любые изменения на стороне сервера (например, обновление временных меток или изменение типа модификаций объекта) автоматически или легко обновляли клиентский объект без необходимости делать это из .then(). Вы не можете напрямую установить его, так как вы потеряете любую дополнительную информацию о модели и вам придется использовать что-то вроде $.extend() - person John; 06.12.2013
comment
Эй, после редактирования вы можете либо сделать _.extend, либо использовать новую функцию объекта Restangular 1.2.0 $. res = res.put (). $ объект; - person mgonto; 11.12.2013
comment
Это мне очень помогло. - person Matthias Max; 16.03.2015

Попробуй это:

res.put().then(function(data) {
    angular.extend(res, data);
});
person Ian Phillips    schedule 12.02.2015