Saya ingin menggunakan $ resource untuk memanggil layanan web RESTful saya, (yang masih saya kerjakan) tetapi saya ingin mencari tahu apakah saya memperbaiki skrip AngularJS saya terlebih dahulu.
ToTO DTO memiliki: {id, order, content, done}
:cmd
jadi saya bisa menelepon api/1/todo/reset
untuk menghapus tabel todo dalam database.
Berikut adalah kode dengan komentar pengertian saya:
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();
}
Satu hal khusus yang saya tidak yakin adalah metode PATCH, saya tidak ingin memperbarui semuanya, dapatkah saya memperbarui hanya satu bidang? Apakah saya membuat potongan kode ini dengan benar?
obj.save()
. Anda dapat melakukan apa yang Anda coba lakukan dengan implementasi $ http dasar.Jawaban:
$ resource dimaksudkan untuk mengambil data dari titik akhir, memanipulasinya dan mengirimkannya kembali. Anda punya beberapa di sana, tetapi Anda tidak benar-benar memanfaatkan itu untuk apa yang harus dilakukan.
Anda boleh memiliki metode khusus pada sumber daya Anda, tetapi Anda tidak ingin ketinggalan fitur keren yang ada pada OOTB.
EDIT : Saya tidak berpikir saya menjelaskan ini dengan cukup baik pada awalnya, tetapi
$resource
melakukan beberapa hal yang funky dengan pengembalian.Todo.get()
danTodo.query()
keduanya mengembalikan objek sumber daya, dan meneruskannya ke dalam panggilan balik untuk saat mendapatkan selesai. Itu melakukan beberapa hal mewah dengan janji di balik layar yang berarti Anda dapat menelepon$save()
sebelumget()
panggilan balik benar-benar menyala, dan itu akan menunggu. Mungkin yang terbaik adalah hanya berurusan dengan sumber daya Anda di dalam janjithen()
atau metode panggilan balik.Penggunaan standar
Demikian juga, dalam hal apa yang Anda posting di OP, Anda bisa mendapatkan objek sumber daya dan kemudian memanggil salah satu fungsi kustom Anda di atasnya (secara teoritis):
Saya akan bereksperimen dengan implementasi OOTB sebelum saya pergi dan menemukan sendiri saya. Dan jika Anda menemukan Anda tidak menggunakan salah satu fitur default
$resource
, Anda mungkin harus menggunakan$http
itu sendiri.Pembaruan: Angular 1.2 dan Janji
Pada Angular 1.2, sumber daya mendukung janji. Tetapi mereka tidak mengubah perilaku lainnya.
Untuk memanfaatkan janji
$resource
, Anda perlu menggunakan$promise
properti pada nilai yang dikembalikan.Contoh menggunakan janji
Perlu diingat bahwa
$promise
properti adalah properti dengan nilai yang sama dengan yang dikembalikan di atas. Jadi Anda bisa menjadi aneh:Ini setara
sumber
Todo.get({id: 123});
mengembalikan janji dan bukan objek langsung?Anda bisa melakukannya
$scope.todo = Todo.get({ id: 123 })
..get()
dan.query()
pada Resource, segera kembalikan objek dan isi dengan hasil dari janji nanti (untuk memperbarui template Anda). Ini bukan janji yang khas yang mengapa Anda harus menggunakan callback atau properti $ janji jika Anda memiliki beberapa kode khusus yang ingin dieksekusi setelah panggilan. Tetapi tidak perlu untuk menetapkannya ke lingkup Anda dalam panggilan balik jika Anda hanya menggunakannya dalam template.sumber