为了账号安全,请及时绑定邮箱和手机立即绑定

AngularJS $ resource RESTful示例

/ 猿问

AngularJS $ resource RESTful示例

慕村225694 2020-02-04 14:15:14

我想使用$ resource调用我的RESTful Web服务(我仍在使用它),但是我想知道我是否首先正确地使用了AngularJS脚本。


待办事项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方法,我不想更新所有内容,可以仅更新一个字段吗?我是否正确构建了这段代码?


查看完整描述

2 回答

?
大话西游666

$ resource旨在从端点检索数据,对其进行处理并将其发送回。您已经有了其中的一些功能,但是您并没有真正利用它来完成它。


在您的资源上有自定义方法是很好的,但是您不想错过OOTB附带的很酷的功能。


编辑:我认为我本来解释得不够好,但是$resource做了一些带有回报的时髦东西。Todo.get()和Todo.query()两个返回的资源对象,并把它传递到回调的GET完成时。它在幕后做了一些花哨的承诺,这意味着您可以$save()在get()回调实际触发之前调用,并且它将等待。最好只在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,则可能应该$http自己使用。


更新:Angular 1.2和Promises

从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;

});


查看完整回答
反对 回复 2020-02-04
?
呼唤远方

你可以做$scope.todo = Todo.get({ id: 123 })。 .get()然后.query()在Resource上立即返回一个对象,并在以后用promise的结果填充它(以更新模板)。这不是一个典型的承诺,这就是为什么如果您要在调用后执行一些特殊代码,则需要使用回调或$ promise属性。但是,如果仅在模板中使用它,则无需在回调中将其分配给您的作用域。


查看完整回答
反对 回复 2020-02-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信