2015-09-09 2 views
1

Я решил взять мой проект в Restangular, но у меня есть некоторые проблемы в операциях SAVE и UPDATE.Проблемы Угловые операции перезагрузки и обновления

Я использую API restheart с mongodb.

В SAVE в моем случае я сохраняю новую запись, и когда я произвожу какие-либо изменения, она сохраняет новый пост, а не обновляет его.

UPDATE, я могу обновить первый экземпляр, например, внести изменения в названии и сохранен, он обновляется, если я обновлю снова .. генерирует эту ошибку:

http://127.0.0.1:8080/api/portfolio/55ef4b15ef862e8f7316cbf1 PUT 412 (Precondition Failed) Follow мой ресурс и код:

Restangular.all($scope.section).getList($scope.query).then(function(res){ 
    $scope.items = res; 
}); 

мой СОХРАНИТЬ:

// create new object item 
$scope.item = Restangular.one($scope.section); 

// save object 
$scope.addItem = function(){ 
    $scope.item.save().then(function(){ 
    toast.msgToast($scope.section + ' ...item criado!'); 
    }, function(err){ 
     toast.msgToast($scope.section + ' ...ocorreu um erro ao criar o item!'); 
    }); 
}; 

мой UPDATE:

$scope.updateItem = function(){ 
     $scope.item.save().then(function(){ 
      toast.msgToast($scope.section+ ' #' +$scope.item._id.$oid+ ' ....Atualizado!'); 
     }); 
    }; 

    $scope.loadItem = function(){ 
     Restangular.one($scope.section, $stateParams.id).get().then(function(item) { 
      $scope.item = item; 
     }); 
    }; 
+0

Почему вы предпочитаете использовать функции post() 'и' put() 'непосредственно, а не метод' save() '? – Beyers

+0

Опубликовать или поставить, та же ошибка, я вещь эта проблема в ответе Etag .. –

ответ

3

В RESTHeart, POST и PUT выполняются операции upsert, т. Е. Они создают ресурс, если он не существует или обновляет его.

Дело здесь о _id:

  • В PUT операций, идентификатор документа задается URI/дб/сбор/id_of_document (более подробную информацию о формате URI в официальной документации here)
  • В операциях POST _id Недвижимость может указывать в полезной нагрузке json. Если он не указан, создается новый документ, и автоматически генерируемый _id (типа ObjectId) возвращается через заголовок ответа . Если указан _id, POST приведет к обновлению, учитывая, что документ с этим _id уже существует.

В вашем случае, на кулаке POST (что создает документ), вам нужно получить Расположение хедер ответа с URI созданного почтового ресурса и перезагрузить его с помощью операции GET; дальнейший POST с этими данными (который теперь содержит сгенерированный _id) приведет к обновлению.

В любом случае, когда вы выполняете операцию POST, PATCH, PUT или DELETE на существующем ресурсе, вам необходимо передать ETag через заголовок запроса If-Match. Дополнительную информацию вы можете найти в разделе официальной документации ETag, включая пример с AngularJs.

Подробнее, есть полный пример веб-приложения с использованием RESTHeart, AngluarJs и Restangular on github: restheart-notes-example.

Обратите внимание на контроллер notes.js, где вы найдете всю логику для создания, обновления и удаления документов.

+0

Thx для ответа, но пример SoftInstigate, не работает для меня. Я изменяю свой код, следую примеру и получаю сообщение об ошибке: Ошибка: data._id не определено –

+0

Одна вещь, которую я когда-либо видел, это то, что не с POST или SAVE, сервер отправляет мне ответ, потому что я мог бы получить id в ответе творения, но ничего не возвращает. –

+1

Если POST или SAVE (PUT) создали документ, вы получили ответ. Это включает заголовок ответа местоположения, который является URI нового документа, который включает идентификатор документа, а также ETag. Вам нужно либо перезагрузить документ (через этот URI), либо вручную добавить _id (обратите внимание, что это {'_id': {'$ oid': ''}} –