2015-12-30 3 views
7

У меня есть этот код:AngularJS ngResource удалить событие не вызывая функцию обратного вызова

dogsResource.delete({id: $stateParams.dogId}, angular.noop, 
     function(value, responseHeaders){ 
      //Success 
      console.log(value); 
      console.log(responseHeaders); 
     }, 
     function(httpResponse){ 
      //Error 
      console.log(httpResponse); 
     } 
    ); 

удаляемого сделан, проблема в том, что ни успех, ни ошибка вызываются. Я также пытался использовать экземпляр (это означает, что использовать $ delete), но он тоже не работал.

Я попытался проверки обратных вызовов с другими методами, например, получить

$scope.dog = dogsResource.get({id: $stateParams.dogId}, function(value, res){ 
    console.log(value); 
}); 

И это работает. Я не знаю, почему это происходит, поскольку собака удаляется из базы данных.

Благодаря

UPDATE

dogResource код

// Return the dogs resource 
.factory('dogsResource', ['$resource', function($resource){ 
    return $resource("http://localhost:5000/dogs/:id",{id: "@id"},{update: {method: "PUT"}}); 
}]) 

UPDATE 2

Я нашел ошибку. Это было в RESTful API (Node js). Метод ничего Угловая не отправлял, поэтому нет обратного вызова не было вызвано:

//DELETE - Delete a dog with specified ID 
exports.deleteDog = function(req, res) { 
    console.log('DELETE' + req.params.id); 

    Dog.findById(req.params.id, function(err, dog) { 
     dog.remove(function(err) { 
      if(err) return res.status(500).send(err.message); 
      console.log('Succesfully deleted.'); 
      res.status(200); 
     }) 
    }); 
}; 

Замена res.status(200) с res.status(200).end() получил обратный вызов тревоги.

Спасибо вам всем за ваше время.

+0

Я знаю, это звучит очевидно, но должно ** angular.noop ** быть там вообще? –

+0

@camden_kid Док говорит, что в действиях без http должно быть postData, и мне это не нужно. Кстати, я также пробовал с null, {} и даже игнорировал его. – CamiloR

+0

Да, в соответствии с этим http://stackoverflow.com/questions/16579201/angularjs-how-to-handle-success-and-error-call-backs-with-ngresource вы правы. Есть ли ошибки в консоли? –

ответ

3

Я предлагаю вам не использовать

res.status (200).конец()

В самом деле, как правило, при удалении объекта со службой REST в expressJS, общий случай послать удаленный объект в ответ, потому что это может быть полезно для внешнего интерфейса, чтобы получить этот объект (и чтобы убедиться, что это хороший объект).

Таким образом, вместо использования

res.status (200) .end()

использование

res.send (собака)

Или если вы хотите отправить пустой ответ, код состояния для операции удаления должен быть:

res.status (204) .end()

204 ОТСУТСТВИЕ СОДЕРЖАНИЕ

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

И для завершения ответа http необходимо отправить, чтобы закрыть запрос. Метод end или метод отправки делают это. Установите код состояния для ответа, который HTTP никогда не отправит во внешний интерфейс. Вот почему ваш угловой обратный вызов никогда не срабатывал.

Поэтому я предлагаю вам добавить тег expressjs к вашему вопросу, потому что это не проблема AngularJS, а реальная ошибка expressJS.

+0

Вы правы. Я думал, что это было угловато, так как удаление было сделано, но потом я обнаружил, что это на самом деле де Апи.Я проверю, что вы говорите, все остальные методы (get, save и т. Д.) Отправляют 'res.send (собака)', но удаление было таким, как я опубликовал в op. Я добавлю теги. – CamiloR

3

В вашем коде, второй аргумент angular.noop:

dogsResource.delete({id: $stateParams.dogId}, angular.noop, 
     function(value, responseHeaders){ 
      //Success 
      console.log(value); 
      console.log(responseHeaders); 
     }, 
     function(httpResponse){ 
      //Error 
      console.log(httpResponse); 
     } 
    ); 

Согласно ngResource Source Code, если установить второй аргумент функции (angular.noopявляется функция), то он будет использовать второй аргумент как обратный вызов успеха. Поскольку второй аргумент является нерабочим, ничего не произойдет, когда он будет вызван.

Попробуйте задать второй аргумент function (r) { console.log (r) } и посмотреть, что вы получаете.

+0

Нет, это не так, как я сказал в комментарии к оп. Даже изменяя, как вы говорите, обратный вызов не вызывается. – CamiloR

1

Используйте обещание вернуть объект $resource. Поскольку объект $ resource по умолчанию возвращает объект обещания, и этот объект обещания доступен .$promise переменная над этим $resource Метод API.

Код

dogsResource.delete({id: $stateParams.dogId}).$promise.then(function(data)//Success 
    console.log(value); 
}, 
function(httpResponse){ //Error 
    console.log(httpResponse); 
}); 
+0

Это не работает. Thanks – CamiloR

+0

@CamiloR Вы могли бы добавить свой код 'dogsResource' в свой вопрос? –

+0

есть код для ресурса, надеюсь, это поможет. – CamiloR

3

Я недавно работал с ngResource. В моем случае я использовал три параметра в этом вызове api. Поэтому вы можете использовать

dogsResource.delete({id: $stateParams.dogId}, function(value, responseHeaders){ 
      //Success 
      console.log(value); 
      console.log(responseHeaders); 
     }, 
     function(httpResponse){ 
      //Error 
      console.log(httpResponse); 
     } 
    ); 

Я надеюсь, что это поможет.

Смежные вопросы