AngularJS $ RESTful ตัวอย่างทรัพยากร


145

ฉันต้องการใช้ทรัพยากร $ เพื่อเรียกใช้บริการทางเว็บ RESTful ของฉัน (ซึ่งฉันยังทำงานอยู่) แต่ฉันต้องการทราบว่าฉันได้แก้ไขสคริปต์ 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();
}

สิ่งหนึ่งที่ฉันไม่แน่ใจคือวิธีการแพทช์ฉันไม่ต้องการอัปเดตทุกสิ่งฉันสามารถอัปเดตเพียงฟิลด์เดียวได้หรือไม่ ฉันกำลังสร้างรหัสชิ้นนี้ถูกต้องหรือไม่


2
ดูเหมือนว่าคุณกำลังใช้ทรัพยากร $ เป็นบริการ $ http พื้นฐาน $ obj.save()ทรัพยากรมากขึ้นสำหรับการรับวัตถุจากแหล่งข้อมูลสงบจัดการกับมันแล้วส่งกลับมาพร้อมกับ คุณสามารถทำสิ่งที่คุณพยายามทำกับการใช้ $ http พื้นฐาน
เบ็นเลช

4
@ เนื้อทำไมเขาไม่ควรใช้ทรัพยากร $ เมื่อเขาต้องการที่จะสื่อสารกับเว็บเซอร์สงบของเขา? อย่างที่คุณพูดนั่นคือจุดประสงค์ของมันใช่มั้ย
F Lekschas

มันมองหาฉัน แต่ฉันจะกำหนดทรัพยากร $ เป็นบริการและฉีดมัน วิธีนี้ช่วยให้คุณสามารถนำมาใช้ซ้ำได้อย่างง่ายดายในภายหลังหากคุณต้องการ
F Lekschas

4
@Flek ดีเขาสามารถใช้ $ ทรัพยากรเช่น $ http ถ้าเขาต้องการที่จะ แต่นั่นไม่ใช่วิธีการใช้งานที่ถูกต้อง
เบ็นเลช

3
ไม่ใช่ปัญหา "จริง ๆ " ต่อการพูด ยิ่งกว่านั้นเขาไม่ได้ใช้ประโยชน์จาก RESTful API และทุกสิ่งที่ $ resource สามารถทำเพื่อคุณได้ทันที
เบ็นเลช

คำตอบ:


211

$ resource หมายถึงการดึงข้อมูลจากจุดปลายจัดการมันและส่งกลับ คุณได้บางอย่างในนั้น แต่คุณไม่ได้ใช้ประโยชน์จากสิ่งที่ทำ

ไม่เป็นไรที่จะมีวิธีการที่กำหนดเองในทรัพยากรของคุณ แต่คุณไม่ต้องการที่จะพลาดในคุณสมบัติเจ๋ง ๆ ที่มาพร้อมกับ OOTB

แก้ไข : ฉันไม่คิดว่าฉันอธิบายได้ดีพอ แต่เดิม แต่$resourceทำสิ่งที่ขี้ขลาดกับผลตอบแทน Todo.get()และTodo.query()ทั้งสองส่งคืนวัตถุทรัพยากรและส่งผ่านเข้าไปในการเรียกกลับเมื่อได้รับเสร็จสมบูรณ์ มันทำสิ่งที่แปลกประหลาดพร้อมสัญญาไว้เบื้องหลังซึ่งหมายความว่าคุณสามารถโทรหา$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 ก่อนที่ฉันจะไปและคิดค้นของตัวเอง และหากคุณพบว่าคุณไม่ได้ใช้คุณสมบัติเริ่มต้นของ$resourceคุณควรจะใช้$httpด้วยตัวเอง

อัปเดต: Angular 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;
});

1
ผมคิดว่าผมจะปรับแต่งคำสั่งของฉันเช่นดังนั้น: ถ้าคุณไม่ได้ใช้ใด ๆคุณสมบัติ OOTB ของ $ ทรัพยากรแล้วคุณเพียงแค่การเพิ่มหน่วยความจำกับวัตถุและฟังก์ชั่นการอ้างอิงคุณไม่จำเป็นต้อง มันจะทำร้ายอะไรหรือเปล่า? อาจจะไม่. แต่มันอาจจะมีประสิทธิภาพมากกว่าถ้าใช้ $ http ถ้าคุณเพียงแค่ทำการดำเนินการ CRUD แบบมาตรฐานและไม่ใช้ประโยชน์จากคุณสมบัติที่เป็นระเบียบของ $ resources
เบ็นเลช

5
เนื้อหนังมีเอกสารอะไรบ้างที่มีฟังก์ชั่น OOTB หรือเปล่า? เอกสารเชิงมุมทำให้เกิดความสับสน
erichrusch

9
น่าเศร้าที่ไม่มีจริงๆ ฉันเพิ่งขุดผ่านแหล่งที่มาของพวกเขาใน GitHub
Ben Lesh

2
ไม่Todo.get({id: 123});คืนสัญญาและไม่ใช่วัตถุที่ตั้งขึ้นใช่หรือไม่
Ingó Vals

1
บางทีคุณอาจจะช่วยฉันด้วยคำถามของฉัน: stackoverflow.com/questions/30405569/...
AJ_83

0

$scope.todo = Todo.get({ id: 123 })คุณก็สามารถทำได้ .get()และ.query()บนทรัพยากรให้ส่งคืนวัตถุทันทีและเติมด้วยผลลัพธ์ของสัญญาในภายหลัง (เพื่ออัปเดตแม่แบบของคุณ) มันไม่ได้สัญญาทั่วไปซึ่งเป็นเหตุผลที่คุณต้องการทั้งใช้โทรกลับหรือคุณสมบัติ $ สัญญาถ้าคุณมีรหัสพิเศษบางอย่างที่คุณต้องการดำเนินการหลังจากที่โทร แต่ไม่จำเป็นต้องกำหนดให้กับขอบเขตของคุณในการโทรกลับหากคุณใช้มันในเทมเพลตเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.