AngularJS $资源RESTful的例子

我想使用$资源来调用我的REST风格的Web服务,(我仍然在工作),但我想知道我的AngularJS脚本是否正确。

todo DTO有: {id, order, content, done}

:cmd是我可以调用api/1/todo/reset来清除数据库中的todo表。

这里是我的理解评论的代码:

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

我不确定的一件事是PATCH方法,我不想更新所有的东西,我能更新一个字段吗? 我正确构build这段代码吗?

$资源是为了从端点检索数据,操纵它并将其发送回去。 你有一些在那里,但你没有真正利用它做的事情。

在你的资源上使用自定义方法是很好的,但是你不想错过OOTB提供的很酷的function。

编辑 :我不认为我已经解释得很好,原来,但$resource与回报做一些时髦的东西。 Todo.get()Todo.query()返回资源对象, 在get完成时将其传递给callback函数。 它在幕后做了一些幻想的事情,这意味着你可以在get()callback实际触发之前调用$save() ,并等待。 在promise then()或callback方法中处理资源可能是最好的。

标准使用

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

同样,在OP中发布的内容的情况下,您可以获取资源对象,然后调用您的任何自定义函数(理论上):

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

然而,在我去之前,我尝试了OOTB的实现,然后发明了我自己的。 如果你发现你没有使用任何$resource的默认function,你可能应该使用它自己的$http

更新:angular1.2和承诺

从angular度1.2来看,资源支持承诺。 但是他们没有改变其余的行为。

要利用$resource承诺,您需要在返回的值上使用$promise属性。

使用promise的例子

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

请记住, $promise属性是一个与上面返回的值相同的属性。 所以你可以变得奇怪:

这些是相同的

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

你可以做$scope.todo = Todo.get({ id: 123 }).get().query()立即返回一个对象,并在稍后用promise来更新结果(更新模板)。 这不是一个典型的承诺,这就是为什么你需要使用callback或$承诺财产,如果你有一些特殊的代码,你想要在执行调用后执行。 但是,如果仅在模板中使用它,则不需要在callback中将其分配给范围。