AngularJS $ ressource exemple RESTful

J'aimerais utiliser $ resource pour appeler mon service Web RESTful (sur lequel je travaille encore), mais j'aimerais savoir si j'ai eu mon script AngularJS correct en premier.

Le DTO complet a: {id, order, content, done}

:cmd est donc je peux appeler api/1/todo/reset pour effacer la table de tâches dans la base de données.

Voici le code avec le 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 particulière, je ne suis pas sûr de la méthode PATCH, je ne veux pas mettre à jour tout, puis-je mettre à jour un seul champ? Est-ce que je construis ce code correctement?

$ Resource était destiné à récupérer des données à partir d'un noeud final, à le manipuler et à le renvoyer. Vous en avez quelque chose, mais vous ne l'utilisez pas vraiment pour ce qu'il a été fait.

Il est judicieux d'avoir des méthodes personnalisées sur votre ressource, mais vous ne voulez pas manquer les fonctionnalités intéressantes avec OOTB.

EDIT : Je ne pense pas que j'ai expliqué cela assez bien à l'origine, mais $resource fait des choses funky avec des retours. Todo.get() et Todo.query() renvoient l'objet ressource et le transmettent dans le rappel pour la fin de l'achèvement. Il fait des choses ravissantes avec des promesses derrière les scènes qui signifient que vous pouvez appeler $save() avant que le rappel get() ne se déclenche réellement, et cela attendra. Il est probablement préférable de traiter votre ressource à l'intérieur d'une promesse then() ou la méthode de rappel.

Utilisation standard

 var Todo = $resource('/api/1/todo/:id'); //create a todo var todo1 = new Todo(); todo1.foo = 'bar'; todo1.something = 123; todo1.$save(); //get and update a todo var todo2 = Todo.get({id: 123}); todo2.foo += '!'; todo2.$save(); //which is basically the same as... Todo.get({id: 123}, function(todo) { todo.foo += '!'; todo.$save(); }); //get a list of todos Todo.query(function(todos) { //do something with todos angular.forEach(todos, function(todo) { todo.foo += ' something'; todo.$save(); }); }); //delete a todo Todo.$delete({id: 123}); 

De même, dans le cas de ce que vous avez affiché dans l'OP, vous pouvez obtenir un objet ressource, puis appeler l'une de vos fonctions personnalisées (théoriquement):

 var something = src.GetTodo({id: 123}); something.foo = 'hi there'; something.UpdateTodo(); 

J'examinerais la mise en œuvre de l'OOTB avant de partir et j'ai inventé la mienne. Et si vous trouvez que vous n'utilisez pas les fonctionnalités par défaut de $resource , vous devriez probablement utiliser $http par lui-même.

Mise à jour: 1.2 et promesses angulaires

À partir de Angular 1.2, les ressources favorisent les promesses. Mais ils n'ont pas changé le reste du comportement.

Pour tirer parti des promesses avec $resource , vous devez utiliser la propriété $promise sur la valeur retournée.

Exemple en utilisant des promesses

 var Todo = $resource('/api/1/todo/:id'); Todo.get({id: 123}).$promise.then(function(todo) { // success $scope.todos = todos; }, function(errResponse) { // fail }); Todo.query().$promise.then(function(todos) { // success $scope.todos = todos; }, function(errResponse) { // fail }); 

Il suffit de garder à l'esprit que la propriété $promise est une propriété sur les mêmes valeurs qu'elle renvoyait au-dessus. Donc, vous pouvez vous rendre étrange:

Ce sont des équivalents

 var todo = Todo.get({id: 123}, function() { $scope.todo = todo; }); Todo.get({id: 123}, function(todo) { $scope.todo = todo; }); Todo.get({id: 123}).$promise.then(function(todo) { $scope.todo = todo; }); var todo = Todo.get({id: 123}); todo.$promise.then(function() { $scope.todo = todo; }); 

Vous pouvez simplement faire $scope.todo = Todo.get({ id: 123 }) . .get() et .query() sur une ressource renvoient un objet immédiatement et le complètent 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 soit utiliser un rappel ou la propriété $ promise si vous avez un code spécial que vous voulez exécuter après l'appel. Mais il n'est pas nécessaire de l'attribuer à votre portée dans un rappel si vous l'utilisez uniquement dans le modèle.