Je voudrais utiliser $ resource pour appeler mon service Web RESTful (sur lequel je travaille toujours) mais j'aimerais savoir si mon script AngularJS est correct en premier.
Le todo DTO a: {id, order, content, done}
:cmd
est donc je peux appeler api/1/todo/reset
pour effacer la table todo dans la base de données.
Voici le code avec commentaire de ma compréhension:
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();
}
Une chose en particulier dont je ne suis pas sûr est la méthode PATCH, je ne veux pas tout mettre à jour, puis-je mettre à jour un seul champ? Suis-je en train de construire correctement ce morceau de code?
obj.save()
. Vous pouvez faire ce que vous essayez de faire avec une implémentation basique de $ http.Réponses:
$ resource était destiné à récupérer les données d'un point de terminaison, à les manipuler et à les renvoyer. Vous en avez une partie , mais vous n'en tirez pas vraiment parti pour ce pour quoi il a été conçu.
C'est bien d'avoir des méthodes personnalisées sur votre ressource, mais vous ne voulez pas manquer les fonctionnalités intéressantes fournies avec OOTB.
EDIT : Je ne pense pas avoir expliqué cela assez bien à l'origine, mais
$resource
fait des trucs géniaux avec des retours.Todo.get()
et lesTodo.query()
deux renvoient l'objet de ressource et le transmettent au rappel pour une fois la récupération terminée. Il fait des choses fantaisistes avec des promesses dans les coulisses qui signifient que vous pouvez appeler$save()
avant que leget()
rappel ne se déclenche réellement, et il attendra. Il est probablement préférable de traiter votre ressource à l'intérieur d'une promessethen()
ou de la méthode de rappel.Utilisation standard
De même, dans le cas de ce que vous avez publié dans l'OP, vous pouvez obtenir un objet ressource, puis appeler l'une de vos fonctions personnalisées dessus (théoriquement):
J'expérimenterais l'implémentation OOTB avant d'aller inventer la mienne. Et si vous constatez que vous n'utilisez aucune des fonctionnalités par défaut de
$resource
, vous devriez probablement l'utiliser$http
seule.Mise à jour: Angular 1.2 et promesses
Depuis Angular 1.2, les ressources prennent en charge les promesses. Mais ils n'ont pas changé le reste du comportement.
Pour tirer parti des promesses avec
$resource
, vous devez utiliser la$promise
propriété sur la valeur renvoyée.Exemple utilisant des promesses
Gardez simplement à l'esprit que la
$promise
propriété est une propriété sur les mêmes valeurs qu'elle renvoyait ci-dessus. Vous pouvez donc devenir bizarre:Ce sont équivalents
la source
Todo.get({id: 123});
retourne pas une promesse et pas un objet direct?vous pouvez simplement le faire
$scope.todo = Todo.get({ id: 123 })
..get()
et.query()
sur une Ressource, renvoyez un objet immédiatement et remplissez-le avec le résultat de la promesse plus tard (pour mettre à jour votre modèle). Ce n'est pas une promesse typique, c'est pourquoi vous devez utiliser un callback ou la propriété $ promise si vous avez un code spécial que vous souhaitez exécuter après l'appel. Mais il n'est pas nécessaire de l'attribuer à votre étendue dans un rappel si vous ne l'utilisez que dans le modèle.la source