2015-12-30 11 views
7

ho questo codice:AngularJS ngResource cancellare evento non chiamare callback

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

La cancellazione è fatto, il problema è che né il successo né errore viene chiamato. Ho anche provato a usare un'istanza (che significa usare $ delete), ma non ha funzionato neanche.

ho provato testare i callback con altri metodi, come ad esempio ottenere

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

E funziona. Non so perché succede, dal momento che il cane viene cancellato dal database.

Grazie

UPDATE

codice dogResource

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

UPDATE 2

ho trovato l'errore. Era nell'API RESTful (Nodo js). Il metodo non è stato l'invio di tutto per angolare, quindi non richiamata è stata innescata:

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

Sostituzione res.status(200) con res.status(200).end() ottenuto la richiamata attivato.

Grazie a tutti per il vostro tempo.

+0

So che sembra ovvio ma dovrebbe ** angular.noop ** essere lì a tutti? –

+0

@camden_kid Il documento dice che le azioni non http get dovrebbero avere un postData e non ne ho bisogno. A proposito, ho anche provato con null, {} e persino ignorandolo. – CamiloR

+0

Sì, secondo questo http://stackoverflow.com/questions/16579201/angularjs-how-to-handle-success-and-error-call-backs-with-ngresource sei corretto. Ci sono errori nella console? –

risposta

3

Suggerisco di non utilizzare per

res.status (200).end()

Infatti di solito quando si elimina un oggetto con un servizio di riposo in expressJS, il caso comune è quello di inviare l'oggetto eliminato come risposta, perché potrebbe essere utile per il frontend per ottenere questo oggetto (e per assicurarsi che sia l'oggetto buono).

Così, invece di utilizzo

res.status (200) .end()

uso

res.send (cane)

Or se si desidera inviare una risposta vuota, il codice di stato per un'operazione di eliminazione dovrebbe essere:

res.status (204) .end()

204 No Content

Si noti che non è necessario impostare il codice di stato di default sarà 200. Così impostata il codice di stato a 200 è solo inutile.

E per completare una risposta HTTP deve essere inviato per chiudere la richiesta. Il metodo end o il metodo send lo fanno. Impostare un codice di stato su una risposta http non invierà mai nulla al frontend. Ecco perché il tuo richiamo angolare non è mai stato attivato.

Quindi ti suggerisco di aggiungere il tag expressjs alla tua domanda, perché non è un problema AngularJS ma un vero errore ExpressJS.

+0

Hai ragione. Ho pensato che fosse angolare da quando l'eliminazione è stata eseguita, ma poi ho scoperto che era in realtà de Api.Controllerò quello che dici, tutti gli altri metodi (get, save, etc) inviano un 'res.send (cane)', ma delete è stato come ho postato nell'op. Aggiungerò i tag. – CamiloR

3

Nel codice, il secondo argomento è 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); 
     } 
    ); 

Secondo il ngResource Source Code, se si imposta il secondo argomento a una funzione (angular.noopè una funzione), allora verrà utilizzato il secondo argomento come il callback di successo. Poiché il secondo argomento è una non operazione, non accadrà nulla quando viene chiamato.

Prova a impostare il secondo argomento su function (r) { console.log (r) } e guarda cosa ottieni.

+0

No, non è così, come ho detto nel commento dell'op. Anche cambiando come dici tu, la callback non viene chiamata. – CamiloR

1

Utilizzare promessa restituita dall'oggetto $resource. Come oggetto risorsa $ per impostazione predefinita restituisce un oggetto promessa e tale oggetto promessa è disponibile variabile .$promise su tale metodo API $resource.

Codice

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

Non funzionava. Grazie – CamiloR

+0

@CamiloR potresti aggiungere il codice 'dogsResource' nella tua domanda? –

+0

c'è il codice per la risorsa, spero che aiuti. – CamiloR

3

sto recente lavorando con ngResource. Nel mio caso, ho usato tre parametri in quella chiamata API. Pertanto, è possibile utilizzare

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

Spero che questo aiuti.

Problemi correlati