Me gustaría usar $ resource para llamar a mi servicio web RESTful, (en el que todavía estoy trabajando), pero me gustaría saber si primero obtuve mi script AngularJS correcto.
El todo DTO tiene: {id, order, content, done}
:cmd
es así que puedo llamar api/1/todo/reset
para borrar la tabla de tareas en la base de datos.
Aquí está el código con comentario de mi comprensión:
function TodoService($resource) {
var src = $resource('api/1/todo/:id:cmd',
{id: "@id", cmd: "@cmd"}, //parameters default
{
ListTodos: { method: "GET", params: {} },
GetTodo: { method: "GET", params: { id: 0 } },
CreateTodo: { method: "POST", params: { content: "", order: 0, done: false } },
UpdateTodo: { method: "PATCH", params: { /*...*/ } },
DeleteTodo: { method: "DELETE", params: { id: 0 } },
ResetTodos: { method: "GET", params: { cmd: "reset" } },
});
//Usage:
//GET without ID
//it calls -> api/1/todo
src.ListTodos();
//GET with ID
//it calls -> api/1/todo/4
src.GetTodo({ id: 4 });
//POST with content, order, done
//it calls -> api/1/todo
src.CreateTodo({ content: "learn Javascript", order: 1, done: false });
//UPDATE content only
//it calls -> api/1/todo/5
src.UpdateTodo({ id: 5, content: "learn AngularJS" });
//UPDATE done only
//it calls -> api/1/todo/5
src.UpdateTodo({ id: 5, done: true });
//RESET with cmd
//it calls -> api/1/todo/reset
src.ResetTodos();
}
Una cosa en particular que no estoy seguro es el método PATCH, no quiero actualizar todo, ¿puedo actualizar solo un campo? ¿Estoy construyendo este código correctamente?
obj.save()
. Podrías hacer lo que estás intentando hacer con una implementación básica de $ http.Respuestas:
$ resource estaba destinado a recuperar datos de un punto final, manipularlos y devolverlos. Tienes algunos de eso allí, pero realmente no lo estás aprovechando para lo que fue hecho para hacer.
Está bien tener métodos personalizados en su recurso, pero no quiere perderse las características geniales que viene con OOTB.
EDITAR : No creo que haya explicado esto bastante bien originalmente, pero
$resource
hace algunas cosas funky con devoluciones.Todo.get()
yTodo.query()
ambos devuelven el objeto de recurso y lo pasan a la devolución de llamada para cuando se complete el get. Hace algunas cosas elegantes con promesas detrás de escena que significan que puede llamar$save()
antes de que laget()
devolución de llamada realmente se active, y esperará. Probablemente sea mejor tratar su recurso dentro de una promesathen()
o el método de devolución de llamada.Uso estándar
Del mismo modo, en el caso de lo que publicó en el OP, podría obtener un objeto de recurso y luego llamar a cualquiera de sus funciones personalizadas (teóricamente):
Sin embargo, experimentaría con la implementación OOTB antes de ir e inventar la mía. Y si descubres que no estás usando ninguna de las funciones predeterminadas de
$resource
, probablemente deberías estar usando$http
solo.Actualización: Angular 1.2 y promesas
A partir de Angular 1.2, los recursos respaldan las promesas. Pero no cambiaron el resto del comportamiento.
Para aprovechar las promesas
$resource
, debe usar la$promise
propiedad en el valor devuelto.Ejemplo usando promesas
Solo tenga en cuenta que la
$promise
propiedad es una propiedad con los mismos valores que estaba devolviendo anteriormente. Entonces puedes ponerte raro:Estos son equivalentes
fuente
Todo.get({id: 123});
devuelve una promesa y no un objeto directo?solo puedes hacer
$scope.todo = Todo.get({ id: 123 })
..get()
y.query()
en un Recurso, devuelva un objeto inmediatamente y llénelo con el resultado de la promesa posterior (para actualizar su plantilla). Es no una promesa típica por lo que es necesario utilizar ya sea una devolución de llamada o la propiedad $ promesa si tiene algún código especial que desea ejecutar después de la llamada. Pero no es necesario asignarlo a su alcance en una devolución de llamada si solo lo está utilizando en la plantilla.fuente