angularjs - cloak - ng-init
Evento de eliminaciĆ³n de AngularJS ngResource no llamando de devoluciĆ³n de llamada (4)
En su código, el segundo argumento es 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);
}
);
De acuerdo con el código fuente de ngResource , si establece el segundo argumento para una función ( angular.noop
es una función), entonces usará el segundo argumento como devolución de llamada exitosa. Como el segundo argumento es una no operación, no pasará nada cuando se llame.
Intente configurar el segundo argumento para la function (r) { console.log (r) }
y vea lo que obtiene.
Tengo este código:
dogsResource.delete({id: $stateParams.dogId}, angular.noop,
function(value, responseHeaders){
//Success
console.log(value);
console.log(responseHeaders);
},
function(httpResponse){
//Error
console.log(httpResponse);
}
);
La eliminación está hecha , el problema es que no se llama ni a éxito ni a error. También intenté usar una instancia (es decir, usar $ delete), pero tampoco funcionó.
Intenté probar las devoluciones de llamada con otros métodos, como obtener
$scope.dog = dogsResource.get({id: $stateParams.dogId}, function(value, res){
console.log(value);
});
Y funciona. No sé por qué sucede eso, ya que el perro está siendo eliminado de la base de datos.
Gracias
ACTUALIZAR
Código dogResource
// Return the dogs resource
.factory(''dogsResource'', [''$resource'', function($resource){
return $resource("http://localhost:5000/dogs/:id",{id: "@id"},{update: {method: "PUT"}});
}])
ACTUALIZACIÓN 2
Encontré el error. Estaba en la API RESTful (nodo js). El método no enviaba nada a Angular, por lo que no se activó ninguna devolución de llamada:
//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);
})
});
};
Al reemplazar res.status(200)
con res.status(200).end()
se desencadenó la devolución de llamada.
Gracias a todos por su tiempo.
Use el retorno de promesa por el objeto $resource
. Como $ resource object devuelve por defecto un objeto promesa, y ese objeto prometido está disponible .$promise
variable sobre ese $resource
método API.
Código
dogsResource.delete({id: $stateParams.dogId}).$promise.then(function(data)//Success
console.log(value);
},
function(httpResponse){ //Error
console.log(httpResponse);
});
Recientemente estoy trabajando con ngResource. En mi caso, he usado tres parámetros en esa llamada de API. Por lo tanto, podrías usar
dogsResource.delete({id: $stateParams.dogId}, function(value, responseHeaders){
//Success
console.log(value);
console.log(responseHeaders);
},
function(httpResponse){
//Error
console.log(httpResponse);
}
);
Espero que eso ayude.
Te sugiero que no uses
res.status (200) .end ()
De hecho, generalmente cuando elimina un objeto con un servicio REST en expressJS, el caso común es enviar el objeto eliminado como respuesta, porque podría ser útil para que el frontend obtenga este objeto (y para asegurarse de que sea el objeto bueno) .
Entonces en vez de usar
res.status (200) .end ()
utilizar
res.send (perro)
O si desea enviar una respuesta vacía, el código de estado para una operación de eliminación debe ser:
res.status (204) .end ()
204 SIN CONTENIDO
Tenga en cuenta que no necesita configurar el código de estado de manera predeterminada, será de 200. Por lo tanto, establecer el código de estado en 200 es inútil.
Y para finalizar, se debe enviar una respuesta http para cerrar la solicitud. El método del final o el método de envío lo hacen. Establezca un código de estado en una respuesta http nunca enviará nada a la interfaz. Es por eso que su devolución de llamada angular nunca se activó.
Así que le sugiero que agregue la etiqueta expressjs a su pregunta, porque no es un problema de AngularJS, sino un error real de expressJS.