Exemplo de RESTful do AngularJS $ resource

Eu gostaria de usar $ resource para chamar meu serviço web RESTful, (no qual ainda estou trabalhando), mas gostaria de saber se meu script AngularJS está correto primeiro.

O DTO todo tem: {id, order, content, done}

:cmd é assim que eu posso chamar api/1/todo/reset para limpar a tabela todo no database.

Aqui está o código com o comentário do meu entendimento:

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

Uma coisa que não tenho certeza é o método PATCH, não quero atualizar tudo, posso atualizar apenas um campo? Estou construindo este pedaço de código corretamente?

$ resource foi criado para recuperar dados de um endpoint, manipulá-lo e enviá-lo de volta. Você tem um pouco disso, mas você não está realmente aproveitando o que foi feito para fazer.

É bom ter methods personalizados em seu recurso, mas você não quer perder os resources interessantes que vem com o OOTB.

EDIT : Eu não acho que eu expliquei isso bem o suficiente originalmente, mas $resource faz algumas coisas funky com retornos. Todo.get() e Todo.query() retornam o object de recurso e o transmitem ao retorno de chamada quando o get é concluído. Ele faz algumas coisas extravagantes com promises nos bastidores, o que significa que você pode chamar $save() antes que o callback get() seja triggersdo, e ele irá esperar. Provavelmente é melhor apenas lidar com seu recurso dentro de uma promise then() ou o método de retorno de chamada.

Uso padrão

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

Da mesma forma, no caso do que você postou no OP, você poderia obter um object de recurso e, em seguida, chamar qualquer uma das suas funções personalizadas (teoricamente):

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

Eu experimentei com a implementação OOTB antes de ir e inventei o meu próprio no entanto. E se você achar que não está usando nenhum dos resources padrão do $resource , provavelmente deveria estar usando apenas $http por conta própria.

Atualização: Angular 1.2 e Promessas

A partir do Angular 1.2, os resources suportam promises. Mas eles não mudaram o resto do comportamento.

Para aproveitar promises com $resource , você precisa usar a propriedade $promise no valor retornado.

Exemplo usando promises

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

Apenas tenha em mente que a propriedade $promise é uma propriedade nos mesmos valores que estava retornando acima. Então você pode ficar estranho:

Estes são equivalentes

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

você pode apenas fazer $scope.todo = Todo.get({ id: 123 }) . .get() e .query() em um recurso retornam um object imediatamente e o preenchem com o resultado da promise mais tarde (para atualizar seu modelo). Não é uma promise típica, e é por isso que você precisa usar um retorno de chamada ou a propriedade $ promise se tiver algum código especial que queira executar após a chamada. Mas não há necessidade de atribuí-lo ao seu escopo em um retorno de chamada se você estiver usando apenas no modelo.