我想使用$ resource来调用我的RESTful Web服务(我还在继续),但是我想先了解一下我的AngularJS脚本是否正确。
todo DTO有:{id, order, content, done}
:cmd
是这样我可以调用api/1/todo/reset
清除数据库中的待办事项表。
以下是我的理解评论的代码:
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方法,我不想更新所有内容,我可以只更新一个字段吗?我是否正确构建了这段代码?
答案 0 :(得分:210)
$ resource旨在从端点检索数据,对其进行操作并将其发回。你已经有那些,但你并没有真正利用它来做它的目的。
在您的资源上使用自定义方法很好,但您不想错过OOTB附带的很酷的功能。
编辑:我认为我最初解释得不够好,但是$resource
做了一些带回归的时髦东西。 Todo.get()
和Todo.query()
返回资源对象,和将其传递到回调以获取完成。它做了一些花哨的东西,幕后承诺意味着你可以在$save()
回调实际触发之前调用get()
,它会等待。最好只是在promise 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实现。如果您发现自己没有使用$resource
的任何默认功能,那么您可能应该只使用$http
。
从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;
});
答案 1 :(得分:0)
你可以做$scope.todo = Todo.get({ id: 123 })
。资源上的.get()
和.query()
会立即返回一个对象,并在稍后用承诺的结果填充它(以更新您的模板)。它是不一个典型的承诺,这就是为什么你需要使用回调或$ promise属性,如果你有一些特殊的代码,你想在调用后执行。但如果您只在模板中使用它,则无需在回调中将其分配给您的范围。