AngularJS $resource RESTful 示例

我想使用 $resource 来调用我的 RESTful Web 服务(我还在做这个工作) ,但是我想先看看我的 AngularJS 脚本是否正确。

待办 DTO 有: {id, order, content, done}

这样我就可以调用 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 方法,我不想更新所有的东西,我可以只更新一个字段吗?我构造的这段代码正确吗?

210087 次浏览

$resource 意味着从端点检索数据、操作数据并将其发送回来。你已经有了 一些,但是你并没有真正地利用它去做它应该做的事情。

在您的资源上拥有自定义方法是可以的,但是您不希望错过 OOTB 附带的很酷的特性。

编辑 : 我认为我最初没有很好地解释这一点,但 $resource在返回方面做了一些时髦的事情。Todo.get()Todo.query()都是 返回资源对象,还有将它传递给 复试,以便在 get 完成时使用。它做了一些花哨的东西,在幕后承诺,这意味着您可以调用 $save()之前,get()回调实际上触发,它将等待。最好的办法可能就是在承诺 then()或回调方法中处理资源。

标准用途

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 实现之前,我会先试验一下 OOTB 实现。如果您发现没有使用 $resource的任何默认特性,那么您可能只需要单独使用 $http

更新: 角度1.2和承诺

在 Angular 1.2中,资源支持承诺,但是他们没有改变其他的行为。

要利用 $resource的承诺,需要对返回的值使用 $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()立即返回一个对象,并在以后用承诺的结果填充它(以更新您的模板)。它是 没有一个典型的承诺,这就是为什么如果在调用之后需要执行一些特殊的代码,那么需要使用回调或 $諾属性。但是,如果您只是在模板中使用它,则不需要在回调中将其分配给您的作用域。